根据单独列的值组合和操作多行中的列值

问题描述 投票:0回答:1

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 中找到它。

提前谢谢您!

r group-by rstudio mutate
1个回答
0
投票
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

	
© www.soinside.com 2019 - 2024. All rights reserved.