[英]R: Obtaining the average of numeric variables while the max for binary variables in a dataframe
[英]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.