【问题标题】:Looping through longitudinal dataset levels遍历纵向数据集级别
【发布时间】:2016-03-14 17:04:42
【问题描述】:

我正在尝试从以下 3 个年龄组的 4 个区域中的每个区域中选择 ids(患者): 2 - 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)
}

我在这个阶段有点卡住,因此非常感谢任何帮助。

【问题讨论】:

  • @Frank,谢谢点。
  • foo&lt;-sapply(c(2,4,6), FUN = function(y) by(longData, longData$region, FUN = function(x) subset(x, age&gt;= y &amp; age &lt; (y+2)))) ?
  • @bouncyball ,感谢您的尝试。这不是我所追求的。我会发布想要的结果。

标签: r function loops


【解决方案1】:

好吧,我回到了这篇文章,我想我可能已经破解了它。首先,我需要重新定义您的 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)))))

【讨论】:

  • 感谢您的尝试。
猜你喜欢
  • 2010-10-16
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多