从另一个data.frame进行回填

从另一个data.frame进行回填,r,R,我经常遇到这样的情况:我必须“填写”来自另一个数据源的信息 例如: 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

我经常遇到这样的情况:我必须“填写”来自另一个数据源的信息

例如:

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>
...
所以,我希望发生的是,用y来填充x。(第13行应为c(“m”、“n”),第1行应为c(“a”、“z”))


目前,我用来处理这个问题的方法似乎复杂而间接。你的方法是什么?请记住,我的数据不一定是这样一个好的顺序,但顺序应该保持在
x
中。我倾向于使用一种只依赖于基本R的解决方案。

如果处理
字符
变量,而不是
因子
,这将是一个简单得多的命题

我将介绍一个简单的
data.table
解决方案(除了许多其他优点外,还有优雅且易于使用的语法)

i.c2
意味着我们使用
i
参数到
[

这种方法假设
c1='m'
中的所有值都不会在
X
中丢失,并且您不想将
c2
中的所有值都替换为
'm'
中的
c1='m'
,而只替换那些丢失的值


基本解决方案 这里是一个基本解决方案——我使用merge,这样
y
data.frame可以包含比实际需要更多的
缺少的
替换(即,可以为所有
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))
#添加第二个缺少的值行,因为这样可以使解决方案更具通用性

x在R基中,我相信这将适用于您:

nas <- is.na(x$c2)
x[nas, ] <- y[y$c1 %in% x[nas, 1], ]

NA在您的数据中,是否像示例中那样
y
只包含一行?还是它有其他不相关的数据?此外,我猜您可以在
x
数据框中有多个
NA
呢?它们总是在
$c2
中吗?示例很简单,但在我的实际数据中有多行数据需要替换。+1 data.table看起来很棒,但对于这个特定的问题,我想继续使用base。为什么不将您已经在做的事情添加到您的问题中呢?那么答案可能会解决您真正的问题。什么时候合并不会直观地起作用?如果您正在寻找不同的方法,我会坚持这一事实,然后将您想要的方法添加到问题中与different from.re:merge的答案一样,当涉及NA值时,它不会直观地起作用-无法比较的值会被推到底部(即,在不通知用户的情况下,而不是停留在“原地”)进行处理.我觉得data.table版本昨天在家里对我有效,但在我的工作计算机上不起作用。你使用的data.table版本是什么?是的,我喜欢这个,我唯一的问题是当我在真实数据上使用它时。真-假值是未排序的,因此它返回顺序不重要的值,但在我的示例中是这样的。我不确定如何引用在我的问题中选择这个。我会考虑一下,然后很快更新。我想你需要
合并
,然后替换,看看我的解决方案。啊,我明白了-我不理解你原来的问题。在这种情况下,我认为@mnel是对的。
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]
  # 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))
nas <- is.na(x$c2)
x[nas, ] <- y[y$c1 %in% x[nas, 1], ]