[英]Applying a function to different levels of a factor in R
我有一個包含30個變量和約6000行的數據集。 變量“圖表編號”標識每個主題,並且每個主題隨時間重復測量。 因此,有約500個唯一的“圖表編號”,但是由於這些主題是多次出現的,因此我們有約6000個觀測值。
現在,我需要使用訪問的主題平均身高為每個主題估算身高數據。 如何將功能應用於圖表編號的每個級別,即每個主題?
現在,我正在創建一個列表,並將每個主題的訪問作為其自己的數據框存儲在列表中,然后在列表的所有元素(數據框)上運行一個循環。
如何在不創建列表的情況下將功能應用於圖表編號的每個級別?
考慮基礎R的ave
的功能跨越了因子水平運行的方法。 具體來說,您可以在ifelse
包含ave()
,以保持不丟失的高度並替換缺失的高度值:
df$imp_visit_height <- ifelse(is.na(df$visit_height),
ave(df$visit_height, df$chart_number,
FUN=function(x) mean(x, na.rm=TRUE)),
df$visit_height)
或使用inner within()
較少的等效詞
df <- within(df, imp_visit_height <- ifelse(is.na(visit_height),
ave(visit_height, chart_number,
FUN=function(x) mean(x, na.rm=TRUE)),
visit_height))
為了用chart_number覆蓋計算語言/程序包的隨機數據進行演示 :
set.seed(43018) # SEEDED FOR REPRODUCIBILITY
grp <- c("julia", "r", "pandas", "sas", "stata", "spss")
df <- data.frame(
chart_number = replicate(100, sample(grp, 1, replace=TRUE)),
time = as.Date(replicate(100, Sys.Date() - sample(1:120, 1, replace=TRUE)),
origin="1970-01-01"),
visit_height = rnorm(100, mean=50, sd=5),
measurement = rnorm(100)*100
)
# RANDOMLY ASSIGN 25 ROWS WITH NA TO visit_height
df[sample(1:100, 25, replace=TRUE), c("visit_height")] <- NA
# CONDITIONALLY IMPUTE MISSING VALUES
df$imp_visit_height <- ifelse(is.na(df$visit_height),
ave(df$visit_height, df$chart_number,
FUN=function(x) mean(x, na.rm=TRUE)),
df$visit_height)
輸出 (過濾到缺少的visit_height)
df[is.na(df$visit_height),]
# chart_number time visit_height measurement imp_visit_height
# 4 sas 2018-02-03 NA -116.072314 49.77708
# 6 spss 2018-04-02 NA 33.049215 52.05987
# 12 julia 2018-01-14 NA 135.954163 52.49936
# 14 pandas 2018-04-09 NA -92.215212 49.23258
# 19 spss 2018-01-21 NA -43.422507 52.05987
# 27 julia 2018-03-18 NA -46.679790 52.49936
# 45 pandas 2018-03-19 NA -181.014747 49.23258
# 48 stata 2018-02-22 NA -89.135797 51.12526
# 51 spss 2018-01-24 NA 9.784664 52.05987
# 53 pandas 2018-04-23 NA 106.461095 49.23258
# 55 pandas 2018-02-17 NA 121.749821 49.23258
# 58 julia 2018-01-19 NA -151.584425 52.49936
# 65 pandas 2018-03-04 NA -148.877957 49.23258
# 70 r 2018-01-05 NA 83.888427 49.29048
# 71 sas 2018-02-21 NA -213.640525 49.77708
# 73 julia 2018-04-18 NA 181.791644 52.49936
# 79 r 2018-03-09 NA -4.446414 49.29048
# 82 pandas 2018-02-20 NA 28.069077 49.23258
# 84 julia 2018-02-27 NA 16.468641 52.49936
# 85 spss 2017-12-31 NA -106.316136 52.05987
# 86 r 2018-02-26 NA 1.450771 49.29048
# 91 spss 2018-04-05 NA -34.662075 52.05987
# 93 r 2018-03-03 NA 36.777125 49.29048
# 95 julia 2018-01-20 NA -36.827340 52.49936
# 98 julia 2017-12-31 NA 125.342483 52.49936
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.