【问题标题】:How to avoid duplicated values uisng rbind and data.frame?如何避免重复值 uisng rbind 和 data.frame?
【发布时间】:2019-08-20 14:56:37
【问题描述】:

我想合并数据框中的值。

我的玩具例子是这个:

table1 <-c()

a <- data.frame("p.value" = c(0.01, 0.05), "Pos" = c(1, 2))
b <- data.frame("p.value" = 0.005, "Pos" = 1)

table1 <- rbind(table1,data.frame(a, b)) 

这给了我这个输出:

> table1
p.value Pos p.value.1 Pos.1
1    0.01   1     0.005     1
2    0.05   2     0.005     1

但我想要的输出是:

> table1
p.value Pos p.value.1 Pos.1
1    0.01   1     0.005     1
2    0.05   2      NA       NA

您能告诉我如何避免重复值并用 NA 填充吗?

【问题讨论】:

  • 我可以看到一个丑陋的解决方案,即在应用rbind() 之前用NA 填充较小的数据框以匹配另一个数据框的大小,但可能有更好的解决方案跨度>

标签: r dataframe rbind


【解决方案1】:

一种方法是让两个数据帧的行数相同,然后cbind

cbind(a, b[seq_len(nrow(a)), ])

#   p.value Pos p.value Pos
#1     0.01   1   0.005   1
#NA    0.05   2      NA  NA

【讨论】:

  • 我想在 for 循环中使用它,这就是我选择这个答案的原因。这里发布的其他答案也是正确的。
【解决方案2】:

如果您不是绝对需要其他 Pos 列,则可以使用来自 tidyverseleft_join

table1 <- rbind(table1, left_join(a, b, by=c("Pos"), suffix = c("", ".1")))

  p.value Pos p.value.1
1    0.01   1     0.005
2    0.05   2        NA

【讨论】:

    【解决方案3】:

    要在不通过Pos合并的情况下获得所需的table1,您可以通过rownames合并:

    tbl_a <- a %>% mutate(names = rownames(a))
    tbl_b <- b %>% mutate(names = rownames(b))
    
    table1 <- tbl_a %>% 
      full_join(tbl_b, by = "names")
    table1
    

    如果要转换回data.frame,请使用

    table1 %>%
      select(-names) %>%
      as.data.frame
    

    这会产生您发布的数据框

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 2017-08-23
      • 2017-01-29
      相关资源
      最近更新 更多