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"))

所以,我希望用 y 填充 x。(第 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意味着我们使用c2fromi参数的值[

这种方法假设不是所有的值 wherec1 = 'm'都会丢失,X并且您不想c2'm'where替换所有的值c1='m',只有那些丢失的值


基础解决方案

这是一个基本解决方案——我使用合并,以便ydata.frame 可以包含missing比实际需要更多的替换(即可以具有所有值的c1值,尽管只c1=需要 m``。

  # 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

在base R中,我相信这对你有用:

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