【问题标题】:Mutate multiple columns in R (tidyverse)变异 R 中的多列(tidyverse)
【发布时间】:2020-12-23 16:15:30
【问题描述】:

我对 R 有一个小问题。 我已经将 2 个数据集合并在一起,我必须计算它们之间的简单比率。数据集不是那么小(每个数据集 18 列),我想避免使用简单的蛮力。

举个例子

df <- data.frame(a1= sample(1:100, 10), b1 = sample(1:100, 10), a2= sample(1:100, 10), b2 = sample(1:100,10)) 

比率只是一列除以另一列,因此在示例中为 c1=a1/b1 和 c2=a2/b2。它可以通过以下方式简单地实现:

mutate(df, c1=a1/b1, c2=a2/b2)

我的问题是,是否有办法使这个过程自动化并指示 R 在不手动输入所有公式的情况下执行变异,以便计算 c1、c2、c3.... c18。

我尝试在列上设置子集的 for 循环,但似乎无法在 tidyverse 中使用。

提前谢谢你

【问题讨论】:

  • 您的实际数据是否包含名为 a1、b1、... a18、b18 的变量,或者您是否将这些名称作为您的问题的示例?

标签: r tidyverse data-wrangling


【解决方案1】:

一种简单的基本 R 方法是执行以下操作:

for (i in 1:2) {
  df[paste0("c", i)] <- df[paste0("a", i)] / df[paste0("b", i)] 
}

但这取决于您的实际变量名称的模式。

使用 tidyverse 工具的另一种方式(但可能有更优雅的方式):

library(tidyverse)
library(glue)

map_dfc(1:2, function(x) {
  transmute(df, "c{x}" := .data[[glue("a{x}")]] / .data[[glue("b{x}")]])
}) %>% 
  bind_cols(df) %>% 
  relocate(starts_with("c"), .after = last_col())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2021-03-03
    相关资源
    最近更新 更多