【问题标题】:rbind data frames, duplicated rownames issuerbind 数据帧,重复的行名问题
【发布时间】:2012-10-13 20:30:53
【问题描述】:

虽然matrix 中允许重复的行(和列)名称,但data.frame 中不允许出现重复的行(和列)名称。尝试rbind() 一些具有共同行名的数据框突出了这个问题。考虑以下两个数据框:

foo = data.frame(a=1:3, b=5:7)
rownames(foo)=c("w","x","y")
bar = data.frame(a=c(2,4), b=c(6,8))
rownames(bar)=c("x","z")
# foo               bar
#   a b               a b
# w 1 5             x 2 6
# x 2 6             y 4 8
# y 3 7

现在尝试rbind()他们(注意行名):

rbind(foo, bar)
#    a b
# w  1 5
# x  2 6
# y  3 7
# x1 2 6
# z  4 8

但是对于matrix的情况:

rbind(as.matrix(foo), as.matrix(bar))
#   a b
# w 1 5
# x 2 6
# y 3 7
# x 2 6
# z 4 8

这里是问题:如何rbind() 两个数据框,删除重复的行(具有相同的行名)?

【问题讨论】:

  • data.frames 中不允许有重复的行名。

标签: r duplicates dataframe duplicate-removal rbind


【解决方案1】:

怎么样

duprows <- which(!is.na(match(rownames(bar),rownames(foo))))
rbind(foo,bar[-duprows,])

?

或者(基于下面的cmets)

duprows <- rownames(bar) %in% rownames(foo)
rbind(foo, bar[!duprows,])

根据 (1) 选择的匹配或不匹配,可能会有多种变化; (2) 为匹配找到数值或逻辑值。

【讨论】:

  • 不错!但是有没有更短的解决方案?我喜欢将 R 问题视为创造性难题!
  • rbind(foo, bar[which(is.na(match(rownames(bar), rownames(foo)))),])
  • @AliSharifi -- rbind(foo, bar[!rownames(bar) %in% rownames(foo),]) 来说感觉最自然。
  • @JoshO'Brien 完美!你为什么不把它作为一个答案?
  • @mplourde 非常好的主意。它可以与 setNames() 一起使用。
【解决方案2】:

如果我正确理解您所追求的,那么用一行代码就可以做到这一点的一种简洁明了的方式:

unique(rbind(bar, foo))
#   a b
# x 2 6
# z 4 8
# w 1 5
# y 3 7

【讨论】:

  • 简洁但稍微效率较低(因为它绑定数据帧,然后丢弃重复项)
猜你喜欢
  • 1970-01-01
  • 2012-12-29
  • 2019-11-05
  • 2013-05-08
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多