【问题标题】:How to create a new column based on calculations from different groups如何根据不同组的计算创建新列
【发布时间】:2020-04-01 18:01:13
【问题描述】:

我是 R 新手,在创建新列时遇到问题,该列的值源自一组特定指令。我的数据框,称为 labdata_wide 看起来像:

共有 51 行,每个参与者一个,5 列(participantgroupbaselineweek 4week 8)。我想创建另一个名为 change 的列,在检查参与者 group(即参与者是 A 组还是 B 组)之后,然后执行 2 个可能的减法计算中的 1 个。

我希望 A 组参与者的 baseline 值从他们的 第 4 周 值中减去,并且 B 组参与者的 第 4 周 > 从它们的 第 8 周 值中减去的值。

A 组 -> 第 4 周 - 基线

B 组 -> 第 8 周 - 第 4 周

计算的值都必须在同一列中。有可能这样做吗?

我尝试过使用 dplyr 包,特别是 mutate 函数,但我无法弄清楚如何解决这个问题。

我试过的代码是:

labdata_wide %>% group_by(group) %>%  mutate(change = week 4[group == 'A'] - baseline[group == 'A'])

但我得到错误代码:

Error: Column "change" must be length 24 (the group size) or one, not 0

奇怪的问题是,即使我指定了哪个组(即 A),我相信它使用的是 B 组值,因为在我的 df 中有 27 个 A 组成员和 24 个 B 组成员。

【问题讨论】:

  • 我也是 Stack Overflow 的新手,我尝试插入我的 df 图像,但 Stack Overflow 为它创建了一个链接。该链接似乎不在我的问题中。这是链接:link

标签: r dplyr


【解决方案1】:

这种方法可能会达到您的目标。由于没有数据,我还没有测试。

library(dplyr)

labdata_wide %>%
  mutate(change = case_when(
                  group == "A" ~ `week 4` - baseline,
                  group == "B" ~ `week 8` - `week 4`,
                  TRUE ~ other value/calculation ) )

# or if only group A & B, simply

labdata_wide %>%
  mutate(change = case_when(
                  group == "A" ~ `week 4` - baseline,
                  group == "B" ~ `week 8` - `week 4`))

PS。您可能希望使用正确的命名(例如,不带空格)更改列名称

【讨论】:

  • 谢谢你,努兰迪!我已经为此苦苦挣扎了一段时间。我运行代码并返回了关于 NA 值的错误消息,但我将 TRUE ~ NA 更改为 TRUE ~ NA_integer_
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
相关资源
最近更新 更多