R 将数据帧的某些列附加到其他列最有效

R 将数据帧的某些列附加到其他列最有效,r,dataframe,append,R,Dataframe,Append,假设我有以下数据框: foo <- data.frame(a=letters,b=seq(1,26), n1=rnorm(26),n2=rnorm(26), u1=runif(26),u2=runif(26)) 这就是诀窍。然而,这似乎有点牵扯其中。我是不是太挑剔了?或者在R中是否有一种更快/更简单的方法可以做到这一点?这里有一种方法使用dplyr中的full\u join(): library(dplyr) ful

假设我有以下数据框:

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

这就是诀窍。然而,这似乎有点牵扯其中。我是不是太挑剔了?或者在R中是否有一种更快/更简单的方法可以做到这一点?

这里有一种方法使用
dplyr中的
full\u join()

library(dplyr)
full_join(df1, df2, by = c("a", "b", "n1" = "u1", "n2" = "u2"))
从文件中:

完全加入

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

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

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


下面是使用
dplyr
中的
full\u join()
的一种方法:

library(dplyr)
full_join(df1, df2, by = c("a", "b", "n1" = "u1", "n2" = "u2"))
从文件中:

完全加入

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

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

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

速记:

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")))
长风(较干燥):

nms速记:

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")))
长风(较干燥):

nms使用
Map()

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")]))
使用
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")]))

您可能会通过搜索整形而不是追加
整形(foo,dir='long',variable=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,我更喜欢您的解决方案,因为它使用的是命名列而不是数字,因此代码可读性更高。我试图阅读
?重塑
,以下是我对您的代码的理解:如果需要,请更正/整合,以便我可以学习。
变化
存储必须连接的列对。所有其他列都是重复的。由于
重塑
的结果还将包含重复的
u1
u2
列,我不需要这些列,因此您仅使用
[,c(“a”,“b”,“n1”,“n2”)]
筛选所需的列。正确吗?@DeltaIV不同的
列是将从宽格式改为长格式的列。所有其他列都假定为id变量,这意味着它们将保持不变,并根据需要进行复制,以匹配从宽到长的维度<代码>重塑
添加一些额外的列,这些列有助于将结果转换回原始格式,但由于此处不需要这些列,因此我们忽略它们them@rawr,你的解决方案是我最喜欢的。如果你把它作为一个答案贴出来,我会选择它。你可能会通过搜索重塑而不是追加
重塑(foo,dir='long',variable=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,我更喜欢您的解决方案,因为它使用的是命名列而不是数字,因此代码可读性更高。我试图阅读
?重塑
,以下是我对您的代码的理解:如果需要,请更正/整合,以便我可以学习。
变化
存储必须连接的列对。所有其他列都是重复的。由于
重塑
的结果还将包含重复的
u1
u2
列,我不需要这些列,因此您仅使用
[,c(“a”,“b”,“n1”,“n2”)]
筛选所需的列。正确吗?@DeltaIV不同的
列是将从宽格式改为长格式的列。所有其他列都假定为id变量,这意味着它们将保持不变,并根据需要进行复制,以匹配从宽到长的维度<代码>重塑
添加一些额外的列,这些列有助于将结果转换回原始格式,但由于此处不需要这些列,因此我们忽略它们them@rawr,你的解决方案是我最喜欢的。如果你把它作为答案发布,我会选择它。@Steven Beaupré,这是一个有趣的选择,但它需要将
foo
初步拆分为
df1
df2
。这不是一件坏事——我现在就是这么做的但是其他解决方案不需要这样做,因此我选择其中一个。嗯,也许创建
df1
df2
并不是严格必要的-可以简单地用
foo[,c(“a”,“b”,“n1”,“n2”)]
foo[,c(“a”,“b”,“u1”,“u2”)]
代替它们,以牺牲可读性为代价。尽管如此,
reformate
解决方案对我来说似乎更具可读性,但这可能只是个人喜好的问题。@DeltaIV你也可以这样做:
full\u-join(选择(foo,-start\u with(“u”)、选择(foo,-start\u with(“n”)、by=c(“a”、“b”、“n1”=“u1”、“n2”=“u2”))
@Steven Beaupré,这是一个有趣的选择,但它需要将
foo
初步拆分为
df1
df2
。这不是一件坏事——我现在就是这么做的但是其他的解决方案不需要这个,所以我同意