将数据框的某些列附加到其他列的效率最高

时间:2016-03-30 17:04:08

标签: r dataframe append

假设我有以下数据框:

foo <- data.frame(a=letters,b=seq(1,26),
                  n1=rnorm(26),n2=rnorm(26),
                  u1=runif(26),u2=runif(26))

我想将列u1u2附加到列n1n2。现在,我发现了以下方式:

df1 <- foo[,c("a","b","n1","n2")]
df2 <- foo[,c("a","b","u1","u2")]
names(df2) <- names(df1)
bar <- rbind(df1,df2) 

这就是诀窍。但是,它似乎有点牵扯。我太挑剔了吗?或者在R中有更快/更简单的方法吗?

3 个答案:

答案 0 :(得分:3)

以下是使用full_join()中的dplyr的一种方式:

library(dplyr)
full_join(df1, df2, by = c("a", "b", "n1" = "u1", "n2" = "u2"))

来自文档:

  

full_join

     

返回x和y中的所有行和所有列。哪里   没有匹配的值,为缺少的值返回NA。

     

     

要加入的变量的字符向量。如果为NULL,则默认为   join将使用具有通用名称的所有变量进行自然连接   两张桌子对面。一条消息列出了变量,以便您可以   检查他们是对的。

     

要通过x和y上的不同变量连接,请使用命名向量。对于   例如,by = c(“a”=“b”)将x.a与y.b匹配。

答案 1 :(得分:2)

使用Map()连接列,并使用cbind()进行回收以获得最终数据框。

cbind(foo[1:2], Map(c, foo[3:4], foo[5:6]))

如果需要,用列名替换数字索引。

cbind(foo[c("a", "b")], Map(c, foo[c("n1", "n2")], foo[c("u1", "u2")]))

答案 2 :(得分:1)

短手:

<form>
  <input type="text" 
         pattern="\d{10}" 
         maxlength="10" 
         placeholder="Input 10 digits"
         title="Input 10 digits" />
  <input type="submit">
</form>

冗长:

rbind(foo[1:4], setNames(foo[c(1, 2, 5, 6)], names(foo[1:4])))

啰嗦(更干):

rbind(foo[c("a", "b", "n1", "n2")], setNames(foo[c("a", "b", "u1", "u2")], c("a", "b", "n1", "n2")))