我已经审核了以下两篇帖子并认为他们可能会回答我的问题,尽管我很难看到如何:
1)Conditional replacement of values in a data.frame 2)Creating a function to replace NAs from one data.frame with values from another
话虽如此,我试图通过引用另一个不同(较短)长度的数据帧来替换一个数据帧中的NAs,并从列“B”中提取替换值,其中每个列中的“A”列的值数据帧匹配。
为了简单起见,我在下面修改了数据,尽管实际数据中的概念是相同的。仅供参考,在实际的第二个数据框中,“A”列中也没有重复。
这是第一个数据框(df1):
> df1
B C A
1 NA 2012-10-01 0
2 NA 2012-10-01 5
3 4 2012-10-01 10
4 NA 2012-10-01 15
5 NA 2012-10-01 20
6 20 2012-10-01 25
7 NA 2012-10-01 0
8 NA 2012-10-01 5
9 5 2012-10-01 10
10 5 2012-10-01 15
> str(df1)
'data.frame': 10 obs. of 3 variables:
$ B: num NA NA 4 NA NA 20 NA NA 5 5
$ C: Factor w/ 1 level "2012-10-01": 1 1 1 1 1 1 1 1 1 1
$ A: num 0 5 10 15 20 25 0 5 10 15
第二个数据框(df2)。
> df2
A B
1 0 1.7169811
2 5 0.3396226
3 10 0.1320755
4 15 0.1509434
5 20 0.0754717
6 25 2.0943396
> str(df2)
'data.frame': 6 obs. of 2 variables:
$ A: int 0 5 10 15 20 25
$ B: num 1.717 0.3396 0.1321 0.1509 0.0755 ...
我认为我与以下代码非常接近:
> ifelse(is.na(df1$B) == TRUE, df2$B[df2$A == df1$A], df1$B)
[1] 1.7169811 0.3396226 4.0000000 0.1509434 0.0754717 20.0000000 NA NA
[9] 5.0000000 5.0000000
Warning message:
In df2$A == df1$A :
longer object length is not a multiple of shorter object length
显然,我希望第7和第8个输出元素是1.7169811和0.3396226,而不是NA。 。
在此先感谢您的帮助,再次感谢您的耐心等待!
答案 0 :(得分:6)
尝试以下代码,该代码采用原始语句并在TRUE
函数的ifelse
参数中进行小调整:
> df1$B <- ifelse(is.na(df1$B) == TRUE, df2$B[df2$A %in% df1$A], df1$B)
# Switched '==' to '%in%' ---^
> df1
B C A
1 1.7169811 2012-10-01 0
2 0.3396226 2012-10-01 5
3 4.0000000 2012-10-01 10
4 0.1509434 2012-10-01 15
5 0.0754717 2012-10-01 20
6 20.0000000 2012-10-01 25
7 1.7169811 2012-10-01 0
8 0.3396226 2012-10-01 5
9 5.0000000 2012-10-01 10
10 5.0000000 2012-10-01 15
答案 1 :(得分:5)
您也可以使用:
df1$B[is.na(df1$B)] <- df2$B[match(df1$A[is.na(df1$B)],df2$A)]
df1
# B C A
# 1 1.7169811 2012-10-01 0
# 2 0.3396226 2012-10-01 5
# 3 4.0000000 2012-10-01 10
# 4 0.1509434 2012-10-01 15
# 5 0.0754717 2012-10-01 20
# 6 20.0000000 2012-10-01 25
# 7 1.7169811 2012-10-01 0
# 8 0.3396226 2012-10-01 5
# 9 5.0000000 2012-10-01 10
# 10 5.0000000 2012-10-01 15
答案 2 :(得分:0)
df1[is.na(df1$B), c('A','C','B')] <- merge(df1[is.na(df1$B), -1], df2, by = 'A')