首页 文章

使用ifelse()通过引用不同长度的另一个数据帧来替换一个数据帧中的NA

提问于
浏览
4

我已经回顾了以下两篇文章并认为他们可能会回答我的问题,尽管我很难看到如何:

1)Conditional replacement of values in a data.frame 2)Creating a function to replace NAs from one data.frame with values from another

话虽如此,我试图通过引用另一个不同(较短)长度的数据帧并从列“B”中提取替换值来替换一个数据帧中的NA,其中每个数据帧中列“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 . . .

在此先感谢您的帮助,再次感谢您的耐心等待!

3 回答

  • 0

    尝试使用以下代码来获取原始语句,并在 ifelse 函数的 TRUE 参数中进行小调整:

    > 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
    
  • 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
    
  • 5
    df1[is.na(df1$B), c('A','C','B')] <- merge(df1[is.na(df1$B), -1], df2, by = 'A')
    

相关问题