[英]R - How to create multiple datasets based on levels of factor in multiple columns?
我对 R 有点陌生,仍在寻找使我的代码更优雅的方法。 我想以更有效的方式创建多个数据集,每个数据集都基于不同列上的特定值。
这是我的数据集:
df<-data.frame(A=c(1,2,2,3,4,5,1,1,2,3),
B=c(4,4,2,3,4,2,1,5,2,2),
C=c(3,3,3,3,4,2,5,1,2,3),
D=c(1,2,5,5,5,4,5,5,2,3),
E=c(1,4,2,3,4,2,5,1,2,3),
dummy1=c("yes","yes","no","no","no","no","yes","no","yes","yes"),
dummy2=c("high","low","low","low","high","high","high","low","low","high"))
我需要每一列都是一个因素:
df[colnames(df)] <- lapply(df[colnames(df)], factor)
现在,我想要获得的是一个名为“Likert_rank_yes”的 Z6A8064B5DF4794555500553C47C55057DZ,其中包含“dummy1”列中具有“是”的所有观察结果,一个名为“Likert_rank_no”的 dataframe 包含“dummy1”列中的所有观察结果“否”,一个名为“Likert_rank_high”的 dataframe 包含所有在“dummy2”列中具有“高”的观察值,以此类推。 我想以某种方式循环或简化该过程,以便运行很少的命令来获取我需要的所有数据集。
前两个数据框应如下所示:
Dataframe 称为“Likert_rank_yes”,其中包含“dummy1”列中具有“yes”的所有观察结果
Dataframe 称为“Likert_rank_no”,其中包含“dummy1”列中具有“no”的所有观察值
我必须对多个具有多个级别的虚拟对象执行此操作,并且希望自动化/循环该过程或使其更高效,这样我就不必为每个虚拟级别对每个 dataframe 进行子集化和重命名。 理想情况下,我还需要删除每个创建的 df 中的最后一列(包含考虑的虚拟对象的列)。
我尝试像下面这样拆分,但似乎不可能使用多个值,我只得到 4 个 dfs(是和高观察,是和低 obs,没有和高 obs 等),如下所示:
list_df <- split(df[c(1:5)], list(df$dummy1,df$dummy2), sep=".")
你能帮我吗? 提前致谢!
你需要两个lapplys
:
vals <- colnames(df)[1:5]
dummies <- colnames(df)[-(1:5)]
step1 <- lapply(dummies, function(x) df[, c(vals, x)])
step2 <- lapply(step1, function(x) split(x, x[, 6]))
names(step2) <- dummies
step2
# $dummy1
# $dummy1$no
# A B C D E dummy1
# 3 2 2 3 5 2 no
# 4 3 3 3 5 3 no
# 5 4 4 4 5 4 no
# 6 5 2 2 4 2 no
# 8 1 5 1 5 1 no
#
# $dummy1$yes
# A B C D E dummy1
# 1 1 4 3 1 1 yes
# 2 2 4 3 2 4 yes
# 7 1 1 5 5 5 yes
# 9 2 2 2 2 2 yes
# 10 3 2 3 3 3 yes
#
#
# $dummy2
# $dummy2$high
# A B C D E dummy2
# 1 1 4 3 1 1 high
# 5 4 4 4 5 4 high
# 6 5 2 2 4 2 high
# 7 1 1 5 5 5 high
# 10 3 2 3 3 3 high
#
# $dummy2$low
# A B C D E dummy2
# 2 2 4 3 2 4 low
# 3 2 2 3 5 2 low
# 4 3 3 3 5 3 low
# 8 1 5 1 5 1 low
# 9 2 2 2 2 2 low
对于第一个数据集(“dummy1”和“no”),使用step2$dummy1$no
或step2[[1]][[1]]
或step2[["dummy1"]][["no"]]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.