我正在努力在 R 中創建一個函式,該函式將接收資料集和列,并輸出由所有這 3 列過濾的資料集的每個排列。
我的資料集看起來像
structure(list(name = c("Peter Doe", "John Gary", "Elsa Johnson",
"Mary Poppins", "Jesse Bogart"), sex = c("Male", "Male", "Female",
"Female", "Male"), class = c("Honors", "Core", "Core", "Honors",
"Honors"), grade = c("A", "A", "A", "B", "C")), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -5L))
我試圖在這里形象化我的目標:

我希望根據它所遵循的地圖的路徑創建新變數(例如,male_honors_a <- 由這些列值過濾的資料集),我想我可以使用粘貼函式來做到這一點,但在這里也不確定。更重要的是,我正在努力解決如何將 for 回圈放在能夠根據列的唯一值進行過濾的函式內。
我已經撰寫了一個單獨創建每個子組的函式,但無法弄清楚如何將它們組合在一起。
subgroups <- function(df, filters, group = "none", name = ""){
listofdfs <- list()
for (i in filters) {
subgroups <- unique(df[[i]])
for (j in subgroups){
x <- df[df[i] == j,]
listofdfs[[paste(name,j, sep = "")]] <- x
}
}
if (group != "none"){
return(listofdfs[[group]])
}
else {
return(listofdfs)}
}
subgroups(df, c("sex", "class", "grade"))
我希望通過運行subgroups(df, c("sex", "class")),我的輸出將是一個資料框串列:
list(male_honors, male_core, female_honors, female_core)
其中male_honors元素是
# A tibble: 2 × 4
name sex class grade
1 Peter Doe Male Honors A
2 Jesse Bogart Male Honors C
非常感謝任何幫助!
uj5u.com熱心網友回復:
直接執行tidyr::nest()此操作。請注意,對于分組/嵌套變數的每個組合,一個小標題都整齊地塞進了data單元格中。groups我已經通過(a)洗掉與分組無關的方面(如過濾器)和(b)默認為空字符向量來稍微修改您的函式,因此如果沒有傳遞任何內容,則不會進行任何分組。
此外,名稱(例如,男性榮譽)很容易通過變數值檢索。這通常比從變數名中檢索值有用得多。
這對您的目的有用嗎?
subgroups <- function(df, groups = character(0)) {
df |>
tidyr::nest(data = -groups)
}
> subgroups(ds, c("class", "sex"))
# # A tibble: 4 × 3
# sex class data
# <chr> <chr> <list>
# 1 Male Honors <tibble [2 × 2]>
# 2 Male Core <tibble [1 × 2]>
# 3 Female Core <tibble [1 × 2]>
# 4 Female Honors <tibble [1 × 2]>
> subgroups(ds, c("sex"))
# # A tibble: 2 × 2
# sex data
# <chr> <list>
# 1 Male <tibble [3 × 3]>
# 2 Female <tibble [2 × 3]>
> subgroups(ds)
# # A tibble: 1 × 1
# data
# <list>
# 1 <tibble [5 × 4]>
其他資源:tidyr 的嵌套資料小插圖
uj5u.com熱心網友回復:
crossing() 函式可能會有所幫助
uj5u.com熱心網友回復:
您可以創建用于過濾的列鍵。密鑰的唯一性可用于回圈遍歷資料框的每個子集。這是一個解決方案,您的資料為df,所需的串列結果為l。
library(dplyr)
#make a key (constructed of 2 or more column values)
df<- df |> mutate(key = paste0(sex, "_", class))
#get the unqiue keys
keys<-unique(df$key)
#make an empty list
l<-list()
#loop through unique keys to filter your df, removing the key column
for(x in 1:length(keys)){
l[[x]]<-df[df$key ==keys[x],] |> select(!key)
}
#name list elements
names(l)<-tolower(keys)
# your desired result
l
寫成一個函式,它看起來像這樣:
subgroups <- function(df, groups = character(0)){
#make a key vector
v <- df |> select(groups)
v <- do.call(paste, c(v, sep = "_"))
#get unqiue keys
keys<-unique(v)
#make an empty list
l<-list()
#loop through unique keys to filter, removing the key column
for(x in 1:length(keys)){
l[[x]]<-df[v %in% keys[x],] |> select(!key)
}
return(l)
}
#example call
subgroups(df, c("sex", "class"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/415724.html
標籤:
