簡體   English   中英

R - 如何根據多列中的因子級別創建多個數據集?

[英]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$nostep2[[1]][[1]]step2[["dummy1"]][["no"]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM