【发布时间】:2018-07-30 14:44:40
【问题描述】:
我想根据一系列 31 个变量对五个数据框进行子集化。数据帧存储在一个列表中:
long_data_sets <- list(scale_g1, scale_g2, scale_g3, scale_g4, scale_g5)
五个数据帧中的每一个都包含一组相同的列,其中包括称为“speeder_225”到“speeder_375”的 31 个因子:
> str(scale_g1[53:83])
'data.frame': 5522 obs. of 31 variables:
$ speeder_225: Factor w/ 2 levels "Non-Speeder",..: 1 1 1 1 1 1 1 1 1 1 ...
$ speeder_230: Factor w/ 2 levels "Non-Speeder",..: 1 1 1 1 1 1 1 1 1 1 ...
$ speeder_235: Factor w/ 2 levels "Non-Speeder",..: 1 1 1 1 1 1 1 1 1 1 ...
$ speeder_240: Factor w/ 2 levels "Non-Speeder",..: 1 1 1 1 1 1 1 1 1 1 ...
$ speeder_245: Factor w/ 2 levels "Non-Speeder",..: 1 1 1 1 1 1 1 1 1 1 ...
...
我想一次根据 31 个因子变量之一对数据帧进行子集化,这样我最终得到 5*31 个新数据帧。
我创建了子集函数,它只保留了我需要的两列(“方向”和“响应”):
create_speeder_data <- function(x, y){
df <- subset(x, x[,y] == "Speeder",
select = c("direction", "response"))
}
这允许我一次创建一个新的数据框:
create_speeder_data(scale_g1, "speeder_225")
我尝试使用 map2() 和 5 个数据框的列表以及 31 个因子名称的列表来应用该函数,但这显然不起作用。
> speeder_var <- names(scale_g1[53:83])
> map2(long_data_sets, speeder_var, create_speeder_data)
Error: `.x` (5) and `.y` (31) are different lengths
我能得到的最接近的方法是从我的函数中取出 y 参数,并将函数应用于 31 个因素之一的五个数据框列表。
#Create subsetting function for "speeder_225"
create_speeder_225_data <- function(x){
df <- subset(x, x$speeder_225 == "Speeder",
select = c("direction", "response"))
}
#Map function to list of data frames
z_speeder_225 <- map(long_data_sets, create_speeder_225_data)
#Change names of new data frames in list
names(long_data_sets) <- c("g1", "g2", "g3", "g4", "g5")
names(z_speeder_225) <- paste0(names_long_data_sets, "speeder_225")
#Get data frames from list
list2env(z_speeder_225, envir=.GlobalEnv)
我需要再重复 30 次才能得到我的 5*31 数据帧。必须有更简单的方法来做到这一点。
非常感谢任何帮助!
【问题讨论】:
-
为什么需要 155 个单独的数据帧?对于很多分析,只使用分组来分离不同的因素更有意义。您可能需要先进行从宽到长的转换。
-
顺便说一句,如果你展示一个具体的例子(不需要是你的真实数据)来说明问题,那么说明从宽到长等会更容易。例如,在 Gautam 的答案是,他创建了一个可以在其上运行代码的 data_list。除了那个很好的例子,这里还有一些其他的指导:stackoverflow.com/questions/5963269/…
-
谢谢你们两位的cmets。不创建数据集而只使用分组并从那里开始确实有意义。连同@Gautam 的建议,这对我有用。以后发布问题时,我会确保遵循指南。
标签: r