[英]Looping through longitudinal dataset levels
我正在嘗試從以下 3 個年齡組的 4 個區域中的每一個中選擇 ids(患者):2 - <4 歲,4 - <6 歲,6 - <8 歲。 數據是下面代碼中給出的longData
。 我只需要選擇符合這些年齡標准的 id 的一半並將它們合並到一個單獨的數據框中。 我已經編寫了一個函數 ( subsetFunc
) 來為每個區域單獨執行此操作,但我希望我可以使用 for 循環編寫代碼來應用類似的函數來從所有四個區域獲取此信息作為單獨的數據框(而不是應用每個區域代碼 4 次)。 我可以簡單地應用該函數 12 次,然后 rbind 每個輸出,但這似乎是重復的。 在我的真實數據集中,我有幾個區域,所以應用這個函數 60 次太乏味了。 此外,這就是編寫函數的重點——使重復的事情自動化。
library(dplyr)
roundUp <- function(x) trunc(x+0.5)
set.seed(2016)
longData <- data.frame(patient=rep(paste(letters[1:20], sep = "_", 1:20), each=5),
age=rep(runif(20, 1, 10), each = 5),var=runif(100, 50, 1000),
time=rep(1:5, 20), region = rep(c("EUROPE", "AFRICA", "ASIA",
"OCEANIA"), c(25, 25, 25, 25)))
subsetFunc <- function(df, group_in, seedNumb, a, b){
data <- filter(df, region == group_in, age >= a, age < b)
set.seed(seedNumb)
n <- roundUp(
data%>% filter(!duplicated(data["patient"])) %>% nrow()/2)
ids <- sample_n(unique(data[, c("patient", "region")]), n)$patient
fd <- data[data$patient %in% ids, ]
return(fd)
}
# this gives half of the children in Europe between ages 2 and < 4 yrs
subsetFunc(longData, "EUROPE", 1, 2, 4)
# Desired Output (tedious method for doing this)
# 2-<4
d_1 <- subsetFunc(longData, "EUROPE", 1, 2, 4)
d_2 <- subsetFunc(longData, "ASIA", 1, 2, 4)
d_3 <- subsetFunc(longData, "OCEANIA", 1, 2, 4)
d_4 <- subsetFunc(longData, "AFRICA", 1, 2, 4)
# 4- < 6
d_5 <- subsetFunc(longData, "EUROPE", 1, 4, 6)
d_6 <- subsetFunc(longData, "ASIA", 1, 4, 6)
d_7 <- subsetFunc(longData, "OCEANIA", 1, 4, 6)
d_8 <- subsetFunc(longData, "AFRICA", 1, 4, 6)
# 6- 8
d_9 <- subsetFunc(longData, "EUROPE", 1, 6, 8)
d_10 <- subsetFunc(longData, "ASIA", 1, 6, 8)
d_11 <- subsetFunc(longData, "OCEANIA", 1, 6, 8)
d_12 <- subsetFunc(longData, "AFRICA", 1, 6, 8)
finalLongData <- rbind(d_1, d_2, d_3, d_4, d_5, d_6, d_7, d_8, d_9,
d_10, d_11, d_12)
我開始寫一些東西:
for (i in levels(longData$cohort)){
dFrame <- subsetFunc(longData, i, 1, a = 0, b = 2)
return(dFrame)
}
我在這個階段有點卡住,因此任何幫助都將受到高度贊賞。
好吧,我回到這個帖子,我想我可能已經破解了它。 首先,我需要重新定義您的subsetFunc
函數:
subsetFunc <- function(df, seedNumb, a, b){
data <- filter(df, age >= a, age < b)
set.seed(seedNumb)
n <- ceiling(
data%>% filter(!duplicated(data["patient"])) %>% nrow()/2)
ids <- sample_n(unique(data[, c("patient", "region")]), n)$patient
fd <- data[data$patient %in% ids, ]
return(fd)
}
然后,我能夠將所有結果放在一起,而無需使用盡可能多的行:
LongDataFinal <-
do.call('rbind',
as.list(sapply(c(2,4,6), FUN = function(y)
by(longData, longData$region,
FUN = function(x) subsetFunc(df = x, seedNumb = 1, a = y, b = y+2)))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.