【问题标题】:Is it possible to combine columns in one dataframe based on the contents of another dataframe?是否可以根据另一个数据帧的内容组合一个数据帧中的列?
【发布时间】:2019-10-05 03:54:12
【问题描述】:

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

我知道,我可以在没有 df2 的情况下直接使用 dplyr mutate 函数来执行此操作,但我的想法是我可以通过分组文件中的未来更改来自动化该过程。

这是一个示例数据框

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 列的数据框。目标是拥有一个新的数据框,它保留 df1 的 ID 变量和 Group_1 到 Group_3 列。例如。 Group_1 应该是“df$B + df$C”

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

这是我想要达到的结果。我不想手动操作,而是使用 df2 作为配方。希望有人能帮帮我

df3 <- df1 %>%
  select(ID) %>%
  mutate (Group_1 = df1$B + df1$C,
          Group_2 = df1$D + df1$A,
          Group_3 = df1$E )

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    这是使用基数 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)
    

    【讨论】:

    • 谢谢罗纳克。这正是我一直在寻找的,而且效果很好。感谢您提供潮汐和基础 R 解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多