【发布时间】:2016-07-18 20:05:46
【问题描述】:
假设我有以下数据框:
foo <- data.frame(a=letters,b=seq(1,26),
n1=rnorm(26),n2=rnorm(26),
u1=runif(26),u2=runif(26))
我想将列 u1 和 u2 附加到列 n1 和 n2。目前,我找到了以下方法:
df1 <- foo[,c("a","b","n1","n2")]
df2 <- foo[,c("a","b","u1","u2")]
names(df2) <- names(df1)
bar <- rbind(df1,df2)
这就是诀窍。但是,它似乎有点涉及。我是不是太挑剔了?或者在 R 中有更快/更简单的方法吗?
【问题讨论】:
-
你可能会通过搜索重塑而不是附加
reshape(foo, dir = 'long', varying = list(c('n1','u1'), c('n2','u2')))[,c("a","b","n1","n2")]来找到你需要的东西 -
也许吧?
rbind(foo[1:4], setNames(foo[c(1, 2, 5, 6)], names(foo[1:4]))) -
@rawr,我更喜欢您的解决方案,因为它使用命名列而不是数字,因此它会产生更具可读性的代码。我尝试阅读
?reshape,这是我对您的代码的理解:如果需要,请更正/整合,以便我学习。varying存储必须连接的列对。所有其他列都是重复的。由于reshape的结果还包含重复的u1、u2列,我不需要这些列,因此您只需使用[,c("a","b","n1","n2")]过滤所需的列。对吗? -
@DeltaIV
varying列将从宽格式重新调整为长格式。所有其他列都假定为 id 变量,这意味着它们将保持不变并根据需要进行复制以匹配从宽到长的尺寸。reshape添加一些额外的列,这些列对于将结果转换回原始格式很有用,但由于这里不需要它们,我们就忽略它们 -
@rawr,您的解决方案是我最喜欢的解决方案。如果您将其发布为答案,我会选择它。