簡體   English   中英

將函數應用於R中不同級別的因子

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM