繁体   English   中英

在 R 中为最大值、最小值和平均值添加额外的变量

[英]Make extra variables for max, min and average in R

在这里,我做了一个尽可能简单的data id表示个人身份证号码。 yearmonthweek列中, 2012052表示 2012 年 5 月的第 2 周。 Wt表示体重, Ht表示身高。

data如下所示:

data<-data.frame(id=c(1,1,1,1,1,2,2,2,2,2),
                 yearmonthweek=c(2012052,2012052,2012052,2012053,2012053,2012051,2012052,2012052,2012052,2012052),
                 Wt=c(61,60,NA,NA,NA,63,62,62,NA,63),
                 Ht=c(173,174,174,175,NA,173,174,173,173,174))

我想为每个id每周制作这些数据。 也就是说,在每个id中, yearmonthweek的值不能重复。 另外,我想制作额外的列来表示平均值、最大值和平均值。 我预期的 output 看起来像这样:

data<-data.frame(id=c(1,1,2,2),
                 yearmonthweek=c(2012052,2012053,2012051,2012052),
                 Wt_avg=c(60.5,NA,63,62.333),
                 Wt_max=c(61,NA,63,63),
                 Wt_min=c(60,NA,63,62),
                 Ht_avg=c(173.5,174.5,173,173.667),
                 Ht_max=c(174,175,173,174),
                 Ht_min=c(173,174,173,173))

使用 cross across多个列应用相同的 function,并使用列表获取多个函数。 由于您的某些组只有 NA,因此在这些情况下,您应该执行ifelse来获取NA而不是NaN (和警告消息)。

library(dplyr)
data %>% 
  group_by(id, yearmonthweek) %>% 
  summarise(across(c(Wt, Ht), list(avg = ~ ifelse(all(is.na(.x)), NA, mean(.x, na.rm = TRUE)), 
                                   min = ~ ifelse(all(is.na(.x)), NA, min(.x, na.rm = TRUE)), 
                                   max = ~ ifelse(all(is.na(.x)), NA, max(.x, na.rm = TRUE)))))
     id yearmonthweek Wt_avg Wt_min Wt_max Ht_avg Ht_min Ht_max
1     1       2012052   60.5     60     61   174.    173    174
2     1       2012053   NA       NA     NA   175     175    175
3     2       2012051   63       63     63   173     173    173
4     2       2012052   62.3     62     63   174.    173    174

您还可以使用此soft function 消除此问题:

soft <- function(x, f, ...) ifelse(all(is.na(x)), NA, f(x, na.rm = TRUE, ...))

data %>% 
  group_by(id, yearmonthweek) %>% 
  summarise(across(c(Wt, Ht), list(avg = ~ soft(.x, mean),
                                   min = ~ soft(.x, min),
                                   max = ~ soft(.x, max))))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM