r - 在 r 中创建嵌套列表
问题描述
我有一个数据框,我想将其用于回归分析。数据如下所示:
COMPANY <- c(rep("COMPANY_1",24),rep("COMPANY_2",24),rep("COMPANY_3",24))
YEAR <- rep(rep(2014:2019, each = 4),3)
SEASON <- rep(c("SPRING","SUMMER","AUTUMN","WINTER"),18)
X <- sample(100:1000,72)
Y <- sample(10:100,72)
df_ALL <- data.frame(COMPANY, YEAR, SEASON, X, Y)
但是,我不想仅基于此数据集进行分析,还希望基于各种子集(例如:仅公司 1、仅针对冬季、仅针对公司 1 在冬季等)。我成功地做到了这一点,方法是创建一个嵌套列表,然后使用 lapply 对嵌套列表中的每个数据帧执行回归(plm)。回归结果存储在第二个嵌套列表中,我可以从中轻松访问它们。
但是,我创建嵌套列表的过程对我来说似乎非常不专业且容易出错。这是我用于创建嵌套列表的代码:
nested_list <- vector(mode="list", length=2)
nested_list <- setNames(nested_list, c("2014-2016","2017-2019"))
for (i in 1:2) {
nested_list[[i]] <- vector(mode = "list", length = 5)
nested_list[[i]] <- setNames(nested_list[[i]],c("ALL_SEASONS","SPRING","SUMMER","AUTUMN","WINTER"))
for (j in 1:5) {
nested_list[[i]][[j]] <- vector(mode="list",length=4)
nested_list[[i]][[j]] <- setNames(nested_list[[i]][[j]],c("ALL_COMPANIES","COMPANY_1","COMPANY_2","COMPANY_3"))
}
}
nested_list[["2014-2016"]][["ALL_SEASONS"]][["ALL"]] <- subset(df_ALL, YEAR >= 2014 & YEAR <= 2016)
nested_list[["2017-2019"]][["ALL_SEASONS"]][["ALL"]] <- subset(df_ALL, YEAR >= 2017 & YEAR <= 2019)
for (i in 1:2) {
nested_list[[i]][["ALL_SEASONS"]][["COMPANY_1"]] <- subset(nested_list[[i]][["ALL_SEASONS"]][["ALL_COMPANIES"]],COMPANY == "COMPANY_1")
nested_list[[i]][["ALL_SEASONS"]][["COMPANY_2"]] <- subset(nested_list[[i]][["ALL_SEASONS"]][["ALL_COMPANIES"]],COMPANY == "COMPANY_2")
nested_list[[i]][["ALL_SEASONS"]][["COMPANY_3"]] <- subset(nested_list[[i]][["ALL_SEASONS"]][["ALL_COMPANIES"]],COMPANY == "COMPANY_3")
for (k in 1:3) {
nested_list[[i]][["SPRING"]][[k]] <- subset(nested_list[[i]][["ALL_SEASONS"]][[k]], SEASON == "SPRING")
nested_list[[i]][["SUMMER"]][[k]] <- subset(nested_list[[i]][["ALL_SEASONS"]][[k]], SEASON == "SUMMER")
nested_list[[i]][["AUTUMN"]][[k]] <- subset(nested_list[[i]][["ALL_SEASONS"]][[k]], SEASON == "AUTUMN")
nested_list[[i]][["WINTER"]][[k]] <- subset(nested_list[[i]][["ALL_SEASONS"]][[k]], SEASON == "WINTER")
}
}
有没有更优雅的方式来创建嵌套列表?还是创建嵌套列表的整个过程而不是使用 lapply 不是很推荐?还有什么替代方案呢?
解决方案
您可以使用 来执行此操作split
,它根据提供的函数创建列表。在这里,我只是介绍了另一个使用年份的专栏,并根据您的喜好命名。然后,仅使用列名拆分其余部分。
df_ALL$split <- ifelse(df_ALL$YEAR > 2016, "2017-2019", "2014-2016")
nested_list <- lapply(split(df_ALL, df_ALL$split), function(x) {
y <- split(x, x$SEASON)
return(lapply(y, function(x) {
split(x, x$COMPANY)
}))
})
由reprex 包于 2020-11-05 创建(v0.3.0)
推荐阅读
- ruby-on-rails - Rails 洗劫 sort_link 下拉菜单
- go - Go - “版本”包以及它是如何工作的?
- c# - IIS 中的 Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery 错误
- android - 如何检测本机反应中启用了开发人员选项?
- java - 构建android设备反应本机的问题
- shader - 如果顶点着色器中的条件导致 Android 10 浏览器上的“没有缓冲区绑定到启用的属性”错误
- html - Internet Explorer 的 ng-autocomplete 问题
- python - 使用lambda(python)在s3中解析/编码csv中的字符串的问题
- tilde - “R”的“波浪号”模型公式应用于Matlab?
- java - 尝试在空对象引用上调用虚拟方法“java.util.Set android.bluetooth.BluetoothAdapter.getBondedDevices()”