【问题标题】:R: How to output a column based on the same formula for each input column?R:如何根据每个输入列的相同公式输出一列?
【发布时间】:2023-03-04 13:17:01
【问题描述】:

latest DataFramesMeta.jl package for Julia一个可以做

x = [:x1, :x2]
n = [:n1, :n2]
@transform(df, cols(x) = :y .+ cols(n))

它将输出x1 = y + x1x2 = y + x2 列。

问题是,如何在 R 中优雅地做到这一点?我可以这样做

library(dplyr)
df = data.frame(y = 1:3, n1 = 1:3, n2 = 1:3)

x = c("m1", "m2")
n = c("n1", "n2")

code = glue::glue_data(list(x=x, n=n), "{x}=y+{n}")
code = glue::glue("vars({paste(code, collapse=',')})")

mutate(df, !!!eval(parse(text=code)))

或在基地中

res = lapply(n, function(n) {
  df$y + df[, n]
}) %>% data.frame

names(res) <- x

df = cbind(df, res)

但感觉很老套。欢迎data.table 和 Base 解决方案。

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

    你可以这样做:

    df[x] <- lapply(df[n], function(p) df$y + p)
    df
    #  y n1 n2 m1 m2
    #1 1  1  1  2  2
    #2 2  2  2  4  4
    #3 3  3  3  6  6
    

    purrr::map 类似:

    df[x] <- purrr::map(df[n], ~df$y + .x)
    

    data.table

    library(data.table)
    setDT(df)[, (x):= lapply(.SD, function(p) p + y), .SDcols = n]
    

    后期意识到我们不需要任何apply函数族,我们可以直接做。

    df[x] <- df[n] + df$y
    

    【讨论】:

    • 主题变体 - df[x] &lt;- Map("+", df["y"], df[n])
    • 我刚刚意识到我们在这里不需要任何类型的apply.*df[x] &lt;- df[n] + df$y 应该可以正常工作吗?
    • 确实,虽然实际上我认为+ 函数可能要复杂得多。
    【解决方案2】:

    我们可以使用sweep

    df[x] <- sweep(df[n], 1, df$y, FUN = `+`)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多