【问题标题】:R dplyr: adding set of columns to other set of columns using dplyrR dplyr:使用 dplyr 将列集添加到其他列集
【发布时间】:2021-01-11 21:33:30
【问题描述】:

我有两个简单的数据框(dfOne 和 dfTwo),我想将第二个数据框 (selectedColumnsTwo) 的列选择添加到第一个数据框 (selectedColumnsOne) 的选择列中:

dfOne <- data.frame(list("a1"=c(1,2,3), "b1"=c(4,5,6), "c1"=c(7,8,9)))
dfTwo <- data.frame(list("a2"=c(1,2,3), "b2"=c(4,5,6)))
selectedColumnsOne = c("a1", "b1")
selectedColumnsTwo = c("a2", "b2")

数据框的样子:

> dfOne
  a1 b1 c1
1  1  4  7
2  2  5  8
3  3  6  9

> dfTwo
  a2 b2
1  1  4
2  2  5
3  3  6

我知道这可以通过一些基础 R 轻松完成:

dfOne[selectedColumnsOne] = dfOne[,selectedColumnsOne]+dfTwo[,selectedColumnsTwo ]

给出想要的结果:

> dfOne
  a1 b1 c1
1  2  8  7
2  4 10  8
3  6 12  9

但是,我使用 dplyr 进行所有数据帧修改,如果我使用 dplyr 而不是 base R 进行此操作,将有助于提高可读性。 那么,还有没有办法用 dplyr 做到这一点?

编辑

这只是一个例子。我原来的两个数据框要大得多,我想要一个不绑定两个数据框的解决方案。另外,我正在寻找一个使用变量 selectedColumnsOne 和 selectedColumnsTwo 的解决方案,并且不需要引用其他列(示例中的列“c1”)

另外,我使用的是 dplyr 0.7.2,如果解决方案在这个版本中有效,那就更好了

我在看类似 mutate_at 的东西,但这不起作用:

> dfOne <- dfOne %>% mutate_at(selectedColumnsOne, .funs=funs(.+dfTwo[,selectedColumnsTwo ]))

Error in mutate_impl(.data, dots) : 
  Column `a1` must be length 3 (the number of rows) or one, not 2

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    一个选项可能是:

    bind_cols(dfOne, dfTwo) %>%
     transmute(across(a1:b1) + across(a2:b2),
               c1)
    
      a1 b1 c1
    1  2  8  7
    2  4 10  8
    3  6 12  9
    

    【讨论】:

    • 我的 dplyr 版本 0.7.2 中似乎无法使用“across”。我没有意识到由于公司规定我不能下载更新的版本。我会接受你的回答,因为我没有指定答案应该适用于特定版本的 dplyr。但是,我确实觉得可能有一个更优雅的解决方案,我不需要绑定列,因为我的原始数据名要大得多,这会产生不必要的开销(同样,我没有在我的问题中指定)。我意识到我应该更好地陈述这个问题。
    • 值得注意的是,转换可以完全以编程方式完成,transmute(across(one_of(selectedColumnsOne)) + across(one_of(selectedColumnsTwo)), across(-one_of(c(selectedColumnsOne,selectedColumnsTwo))))。可能是时候让您的公司升级了。
    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 2021-07-29
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多