【问题标题】:using merge in R to fill in the NA in a data.frame使用 R 中的合并在 data.frame 中填充 NA
【发布时间】:2011-03-07 06:53:36
【问题描述】:

我有一个数据框 a 缺少一些单元格的信息,我收集了丢失的数据并随后创建了另一个数据框 b

通常我通过以下代码填写缺失的数据:

for (loop.b in (1:nrow(b)))
    {a[a[,"uid"]==b[loop.b,"uid"],"var1"] <- b[loop.b,"var1"]
    }

这对我来说没问题,但如果 b 有很多行怎么办?然后显式循环将使过程变慢。有没有更优雅的方式来做这种“缺失数据替换”的工作?

谢谢。

【问题讨论】:

  • 看看norm包和prelim.norm函数。 Hmisc 有很好的估算工具,更不用说mi... CRAN 包列表是一个很好的起点。
  • 哦,顺便说一句,摆脱那个讨厌的循环... =)
  • 我可能很密集,你能通过发布一个可复制的小例子来帮助我吗?

标签: r merge


【解决方案1】:

假设以下两个数据框与您描述的相似:

R> a <- data.frame(uid=1:10,var1=c(1:3,NA,5:7,NA,9:10))
R> a
   uid var1
1    1    1
2    2    2
3    3    3
4    4   NA
5    5    5
6    6    6
7    7    7
8    8   NA
9    9    9
10  10   10

R> b <- data.frame(uid=c(8,4),var1=c(74,82))
R> b
  uid var1
1   8   74
2   4   82

那么你可以直接使用下面的:

R> a[b$uid,"var1"] <- b$var1

这给出了:

R> a
   uid var1
1    1    1
2    2    2
3    3    3
4    4   82
5    5    5
6    6    6
7    7    7
8    8   74
9    9    9
10  10   10

【讨论】:

    【解决方案2】:

    这行得通:

    # matches of a$uid in b$uid, NA if not match
    ind = match(a$uid, b$uid) 
    # 'ind' are the index in b and NA, we remove the latter
    a[!is.na(ind),"var1"] = b[ind[!is.na(ind)],"var1"] 
    

    【讨论】:

      【解决方案3】:

      我想你想要match,但很难猜出你的数据是什么样的。

      ## a's var1 has some missing values
      a <- data.frame(var1 = c(1, NA, 4.5, NA, 6.5), uid = 5:1)
      ## b knows all about them
      b <- data.frame(var1 = c(2.3, 8.9), uid = c(2, 4))
      
      ## find the indexes in a$uid that match b$uid
      ind <- match(b$uid, a$uid)
      
      ## those indexes now can be filled directly with b$uid
      a$var1[ind] <- b$var1
      

      即使 uid 不是唯一的(尽管名称有点暗示它们是唯一的),这也将起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-07
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多