Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 是否可以基于另一个数据帧的内容在一个数据帧中组合列?_R_Dataframe_Dplyr - Fatal编程技术网

R 是否可以基于另一个数据帧的内容在一个数据帧中组合列?

R 是否可以基于另一个数据帧的内容在一个数据帧中组合列?,r,dataframe,dplyr,R,Dataframe,Dplyr,我面临着一个可能非常简单的问题,我被卡住了。我有一个数据帧(df1)和第二个数据帧(df2),我想用它作为组合df1列的方法。df2中的列名称应该是最终数据帧的新列名 df1 <- data.frame( ID = seq(1:5), A = c(10,15,20,90,1), B = c(10,15,5,10,1), C = c(10,15,5,10,1), D = c(1,20,34,12,5), E = c(2,23,34,12,5) ) 我知道,我可以直

我面临着一个可能非常简单的问题,我被卡住了。我有一个数据帧(df1)和第二个数据帧(df2),我想用它作为组合df1列的方法。df2中的列名称应该是最终数据帧的新列名

df1 <- data.frame(
  ID = seq(1:5),
  A = c(10,15,20,90,1),
  B = c(10,15,5,10,1),
  C = c(10,15,5,10,1),
  D = c(1,20,34,12,5),
  E = c(2,23,34,12,5)
) 
我知道,我可以直接使用dplyr mutate函数而不使用df2来实现这一点,但是我的想法是,我可以通过分组文件中的未来更改来自动化这个过程

这是一个示例数据帧

df1 <- data.frame(
  ID = seq(1:5),
  A = c(10,15,20,90,1),
  B = c(10,15,5,10,1),
  C = c(10,15,5,10,1),
  D = c(1,20,34,12,5),
  E = c(2,23,34,12,5)
) 

df1这里有一种使用基数R的方法,我们在
df2
的每一列上循环,将
df1
中的列子集,并取
rowSums
得到和

cbind(df1[1], sapply(df2, function(x) rowSums(df1[unique(x)])))

#  ID Group_1 Group_2 Group_3
#1  1      20      11       2
#2  2      30      35      23
#3  3      10      54      34
#4  4      20     102      12
#5  5       2       6       5

使用
tidyverse
的类似方法如下

library(dplyr)
library(purrr) 

bind_cols(df1[1], map_df(df2, ~rowSums(df1[unique(.x)])) )
这是在使用
stringsAsFactors=FALSE
读取
df2
中的数据之后

df2 <- data.frame (
   Group_1 = c("B","C"),
   Group_2 = c("D","A"),
   Group_3 = ("E"), stringsAsFactors = FALSE)

df2谢谢你,罗纳克。这正是我一直在寻找的,它工作得非常完美。感谢您提供tidiverse和base R解决方案。
df2 <- data.frame (
   Group_1 = c("B","C"),
   Group_2 = c("D","A"),
   Group_3 = ("E"), stringsAsFactors = FALSE)