53

这只是在这里对另一个问题的回答。当您使用rbind两个数据框时,它会按名称而不是索引匹配列,这可能会导致意外行为:

> df<-data.frame(x=1:2,y=3:4)
> df
  x y
1 1 3
2 2 4
> rbind(df,df[,2:1])
  x y
1 1 3
2 2 4
3 1 3
4 2 4

当然,也有解决方法。例如:

rbind(df,rename(df[,2:1],names(df)))
data.frame(rbind(as.matrix(df),as.matrix(df[,2:1])))

编辑时:renameplyr包中实际上并没有以这种方式工作(尽管我最初写这篇文章时以为我已经工作了……)。通过重命名来做到这一点的方法是使用 SimonO101 的解决方案:

rbind(df,setNames(df[,2:1],names(df)))

此外,也许令人惊讶的是,

data.frame(rbindlist(list(df,df[,2:1])))

按索引工作(如果我们不介意数据表,那么它非常简洁),所以这是do.call(rbind).

rbind问题是,对于名称不匹配的两个数据框,最简洁的方法是什么?我知道这似乎微不足道,但这种事情最终会导致代码混乱。而且我不想编写一个名为rbindByIndex. 理想情况下,它会像rbind(df,df[,2:1],byIndex=T).

4

2 回答 2

54

你可能会发现setNames这里很方便...

rbind(df, setNames(rev(df), names(df)))
#  x y
#1 1 3
#2 2 4
#3 3 1
#4 4 2

我怀疑您的实际用例要复杂一些。您当然可以根据需要对第一个参数中的列重新排序setNames,只需names(df)在第二个参数中使用,以便重新排序的列的名称与原始列的名称匹配。

于 2013-10-10T14:02:48.467 回答
8

这似乎很容易:

mapply(c,df,df[,2:1])
     x y
[1,] 1 3
[2,] 2 4
[3,] 3 1
[4,] 4 2

但是,对于这种简单的情况,您必须将其转换回数据框(因为将其mapply简化为矩阵):

as.data.frame(mapply(c,df,df[,2:1]))
  x y
1 1 3
2 2 4
3 3 1
4 4 2

重要说明 1:当您的数据框包含不同类型的向量时,类型强制似乎有一个缺点:

df<-data.frame(x=1:2,y=3:4,z=c('a','b'))
mapply(c,df,df[,c(2:1,3)])
     x y z
[1,] 1 3 2
[2,] 2 4 1
[3,] 3 1 2
[4,] 4 2 1

重要说明 2:如果你有因素,这也很糟糕。

df<-data.frame(x=factor(1:2),y=factor(3:4))
mapply(c,df[,1:2],df[,2:1])
     x y
[1,] 1 1
[2,] 2 2
[3,] 1 1
[4,] 2 2

因此,只要您拥有所有数字数据,就可以了。

于 2013-10-10T13:52:37.640 回答