TL;DR:如何按 ID 列对行进行分组,保留大量列的值并对少量列求和?
我有一个来自临床研究的相对较大的数据框(1000 列 x 1000 行)。
为了更容易解释,为了简单起见,我们假设这个数据是针对健身房用户的。它的格式非常烦人。
每个用户都有一个主行,其中记录了有关他们的大量信息(900 多列)。对于每次访问健身房,每个用户都有一个额外的访问行,其中包含他们在每个区域花费的时间。
主行在访问时间列中具有 NA,访问行在主列中具有 NA。还有一些数据缺失。
示例如下:
#master row information# #visit row information
gym_id name weight height (900+ col data) time_gym time_sauna time_cafe
001 Alice 130 60 ... NA NA NA
001 Alice NA NA ... 20 NA 10
001 Alice NA NA ... 60 NA NA
002 Bob 200 70 ... NA NA NA
003 Eve 140 70 ... NA NA NA
003 Eve NA NA ... 100 10 NA
003 Eve NA NA ... 80 NA NA
003 Eve NA NA ... 50 15 NA
003 Eve NA NA ... 50 10 NA
003 Eve NA NA ... 60 NA 5
003 Eve NA NA ... 40 NA NA
003 Eve NA NA ... 80 5 NA
....
创建此代码的代码是:
gym_id <- c(1, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3)
name <- c('Alice', 'Alice', 'Alice', 'Bob', "Eve", "Eve", "Eve", "Eve", "Eve", "Eve", "Eve", "Eve")
weight <- c(130, NA, NA, 200, 140, NA, NA, NA, NA, NA, NA, NA)
height <- c(60, NA, NA, 70, 70, NA, NA, NA, NA, NA, NA, NA)
time_gym <- c(NA, 20, 60, NA, NA, 100, 80, 50, 50, 60, 40, 80)
time_sauna <- c(NA, NA, NA, NA, NA, 10, NA, 15, 10, NA, NA, 5)
time_cafe <- c(NA, 10, NA, NA, NA, NA, NA, NA, NA, 5, NA, NA)
gym <- data.frame(gym_id, name, weight, height, time_gym, time_sauna, time_cafe)
我想合并这些行,以便每个用户有一行,其中包含他们的主信息以及每个区域的“总”访问时间。我理想地想使用 dplyr,因为我发现它更容易理解。上面的例子将变成:
#master row information# #visit row information
gym_id name weight height (900+ col data) total_gym total_sauna total_cafe
001 Alice 130 60 ... 80 0 10
002 Bob 200 70 ... 0 0 0
003 Eve 140 70 ... 460 40 5
添加额外的总时间列并处理 NA 就可以了。
我尝试过以各种组合使用 mutate()、group_by()、summarise(),但我很难找到解决方案,因为我总是丢失其余的其他列,例如通过使用以下内容:
gym %>%
group_by(gym_id) %>%
summarise(total_gym = sum(time_gym), total_sauna = sum(time_sauna))
我能找到的保留列的唯一方法似乎是在 summarise() 代码中指定每一列,并且无法在代码中指定所有 900 多个列。或者,我最终创建了两个不同的数据帧作为解决方法 - 一个主数据帧和一个总时间帧,但这会导致分析下游出现进一步的问题。
我确信有一种非常简单的方法可以做到这一点,并且我知道如何在其他语言中做到这一点,但我很难在 R 中找到它。
提前谢谢您!
across()
summarize(gym, across(weight:time_cafe, ~sum(.x,na.rm = T)),.by = c(gym_id, name))
输出:
gym_id name weight height time_gym time_sauna time_cafe
1 1 Alice 130 60 80 0 10
2 2 Bob 200 70 0 0 0
3 3 Eve 140 70 460 40 5