【问题标题】:How to refer to other column names within dplyr mutate across如何在 dplyr 中引用其他列名
【发布时间】:2021-01-24 17:00:36
【问题描述】:

希望是一个简单的问题。我想使用 dplyr mutate across,并引用另一个静态列以用于所有 mutate 函数。

df <- data.frame(baseline = c(1,2,3), day1 = c(NA,2,2), day2 = c(2,3,4), day3= c(5,4,6))

我想为基线上每天的变化创建一个新列“fc”。我想我可能需要 'sym' 和 !!围绕基线使其工作,但还没有弄清楚。

df %>% mutate(fc = mutate(across(starts_with('day')), ./baseline))

给出错误

警告信息: 在 format.data.frame(if (omit) x[seq_len(n0), , drop = FALSE] else x, 中: 损坏的数据框:列将被截断或用 NA 填充

更新:我在每一天的列中都有一些缺失值,因此编辑了上面的代码。当输入中有 NA 时,如何在输出中加入给出 NA 而不是失败?

【问题讨论】:

  • 我希望将 3 个新列 fc 添加到数据框中,并使用每天的默认命名(我认为是 dayx_fc)或替换原始列。无论哪种方式都适合我。

标签: r dplyr columnname across


【解决方案1】:

试试这个:

library(dplyr)
#Code
df2 <- df %>% mutate(across(day1:day3,.fns = list(fc = ~ ./baseline)))

输出:

  baseline day1 day2 day3   day1_fc  day2_fc day3_fc
1        1    2    2    5 2.0000000 2.000000       5
2        2    2    3    4 1.0000000 1.500000       2
3        3    2    4    6 0.6666667 1.333333       2

或保持相同的变量:

#Code 2
df <- df %>% mutate(across(day1:day3,~ ./baseline))

输出:

  baseline      day1     day2 day3
1        1 2.0000000 2.000000    5
2        2 1.0000000 1.500000    2
3        3 0.6666667 1.333333    2

添加新数据后,您将获得以下信息:

#Code 3
df2 <- df %>% mutate(across(day1:day3,.fns = list(fc = ~ ./baseline)))

输出:

  baseline day1 day2 day3   day1_fc  day2_fc day3_fc
1        1   NA    2    5        NA 2.000000       5
2        2    2    3    4 1.0000000 1.500000       2
3        3    2    4    6 0.6666667 1.333333       2

【讨论】:

  • 这非常适合我的代表。现在我意识到我的下一个问题是我的“日”列中有一些缺失值,所以出现错误。如果缺少日期值,您能否帮助编辑 ./baseline 函数以提供 NA?我会更新问题。
  • @user42485 即使使用NA,它也能正常工作,因为您将得到NA。我已经用你分享的新数据添加了输出!
  • 知道了!我认为我的价值观实际上是缺失的,而不是 NA。但是我会将它们替换为 NA 然后应该可以工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 2020-09-21
  • 2021-09-21
  • 2019-04-08
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
相关资源
最近更新 更多