【问题标题】:How to use purrr to replace a modifying for loop in R?如何使用 purrr 替换 R 中的修改 for 循环?
【发布时间】:2021-12-25 14:19:16
【问题描述】:

我有一个这样的数据框:

df <- data.frame(
  Group = c('A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'),
  Value = c(12, 88, 54, 76, 23, 44, 60, 52, 18)
)

我想将每个组的中位数缩放为 100,并将 Value 列替换为新值,因此数据框如下所示:

df_desired <- data.frame(
  Group = c('A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'),
  Value = c(20, 169.23, 122.73, 126.67, 44.23, 100, 100, 100, 40.91)
)

像这样使用 scale_helper:

scale_helper <- function(x, value) x * value / median(x)

我可以使用for 循环来做到这一点,但如果可能的话,我想改用purrr。有没有使用purrr 的直接方法,或者for 循环是更好的方法?

【问题讨论】:

  • 你没有解释你为什么要用purrr来做这个。
  • 我需要解释一下吗?我想要一个 for 循环的替代方案。
  • 您在寻找df %&gt;% group_by(Group) %&gt;% mutate(new_val = scale_helper(Value, 100))吗?我认为这里没有任何必要使用purrr...
  • 如果您要处理存储在列表中的多个 data.frame,我会选择 purrr。对于处理单个 data.frame,dplyr 就足够了。
  • @NatashaR,你在问一个 for 循环是否更好,但我不清楚如何在不知道你为什么不想使用的情况下衡量它。

标签: r dplyr purrr


【解决方案1】:

循环不是好方法,但我不明白你为什么要使用 purr。我认为,这是一个很好的版本:

df %>% group_by(Group) %>% mutate(Value = scale_helper(Value, 100)) %>% as.data.frame()

或者你可以使用data.table。像这样的:

as.data.table(df)[, lapply(.SD, scale_helper, 100), keyby = Group]

【讨论】:

    猜你喜欢
    • 2019-12-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多