簡體   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