4

別のデータ ソースから情報を「入力」しなければならない状況がよくあります。

例えば:

x <- data.frame(c1=letters[1:26],c2=letters[26:1])
x[x$c1 == "m","c2"] <- NA
x[x$c1 == "a","c2"] <- NA

   c1   c2
1   a <NA>
2   b    y
3   c    x
4   d    w
5   e    v
6   f    u
7   g    t
8   h    s
9   i    r
10  j    q
11  k    p
12  l    o
13  m <NA>
...

さて、その不足している変数を使用して、別のdata.frameを使用して確認して入力したいと思います。それを呼び出しましょうy

y <- data.frame(c1=c("m","a"),c2=c("n","z"))

だから、私がしたいのは、xがyで埋められることです。(13行目はc("m","n")、1行目はc("a","z"))

これに対処するために私が現在使用している方法は、複雑で間接的なようです。あなたのアプローチは何ですか?私のデータは必ずしもこのような良い順序になっているわけではありませんが、順序はx. 私の好みは、ベース R 以外に依存しないソリューションです。

4

2 に答える 2

3

characterではなく変数を扱う場合、これははるかに単純な命題になりますfactors

簡単な data.table解決策を提示します(他の多くの利点の中でもエレガントで使いやすい構文のため)

x <- data.frame(c1=letters[1:26],c2=letters[26:1], stringsAsFactors =FALSE)
x[x$c1 == "m","c2"] <- NA
y <- data.frame(c1="m",c2="n", stringsAsFactors = FALSE)
library(data.table)
X <- as.data.table(x)
Y <- as.data.table(y)

マージを簡単にするために、次のことを示す列を作成します

X[,missing_c2 := is.na(c2)]
# a similar column in Y
Y[,missing_c2 := TRUE]

setkey(X, c2, missing_c2)
setkey(Y, c2, missing_c2)
# merge and replace (by reference) those values in X with the the values in `Y` 
X[Y, c2 := i.c2]

引数からのi.c2値を使用する手段c2i[

c1 = 'm'このアプローチでは、すべての値 whereが欠落するわけではなく、すべての値をwhereXに置き換えたくないことを前提としています。欠落している値のみを置き換えます。c2'm'c1='m'


基本ソリューション

ここに基本的な解決策があります-私はマージを使用して、 data.frameに実際に必要な数よりもy多くの置換を含めることができます(つまり、m``のみが必要ですが、missingすべての値の値を持つことができます.c1c1=

  # add a second missing value row because to make the solution more generalizable
x <- rbind(x, data.frame(c1 = 'm',c2 = NA, stringsAsFactors = FALSE) )
missing <- x[is.na(x$c2),]
merged <- merge(missing, y, by = 'c1')

x[is.na(x$c2),] <- with(merged, data.frame(c1 = c1, c2 = c2.y, stringsAsFactors = FALSE))

使用factorsすると、レベルが対応していることを確認して、痛みの壁にぶつかります。

于 2012-10-29T02:11:42.030 に答える
2

ベースRでは、これがうまくいくと思います:

nas <- is.na(x$c2)
x[nas, ] <- y[y$c1 %in% x[nas, 1], ]
于 2012-10-29T02:19:37.103 に答える