我经常遇到需要从其他数据源“填写”信息的情况。
例如:
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的解决方案。
答案 0 :(得分: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
表示我们使用c2
参数中的i
值[
此方法假设并非c1 = 'm'
中X
中缺少c2
的所有值,并且您不希望将'm'
中的所有值替换为c1='m'
其中y
1}},只有那些缺少的
这是一个基本解决方案 - 我使用合并,以便missing
data.frame可以包含比实际需要更多的c1
替换(即可以包含所有c1=
值的值,虽然只需要 # 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))
m``。
factors
如果你使用{{1}},你会遇到一道痛苦的墙,确保水平相符。
答案 1 :(得分:2)
在基地R中,我相信这对你有用:
nas <- is.na(x$c2)
x[nas, ] <- y[y$c1 %in% x[nas, 1], ]