我正在嘗試在 R 中創建代碼,該代碼將立即識別某個列的值,找到具有該值的所有行,并從所有這些行中提取資料,包括在新資料框中與這些行相交的所有其他列。我希望對基列中的每個不同值重復此操作。例如:
mydata <- data.frame(x = c(1,2,3), y = c('a','b','c'), z = c('red','red','yellow'))
colors <- list(mydata$z)
for (i in 1:length(colors)) {
assign(paste0("mydata_",i), subset(mydata, z == colors[[i]]))
}
這是我最近的嘗試,但無法正常作業。目標是在此示例中擁有 2 個名為“mydata_red”和“my_data_yellow”的新資料幀。每個將只包含匹配的行
uj5u.com熱心網友回復:
使用assign將框架或串列拆分為多個物件是一種反模式,并且很少能改進將所有框架保存在list. 請參閱如何制作資料框串列?關于這個話題的討論。一個前提是,當您對串列中的一個框架執行某些操作時,您可能會執行與框架串列中的其他元素非常相似的操作,并且使用lapply和概括您的方法處理串列可以使您更清晰解決方案等。
要獲得這些資料,就像拆分一樣簡單:
LOF <- split(mydata, mydata$z)
LOF ## <- "List Of Frames", perhaps not the most awesome name?
# $red
# x y z
# 1 1 a red
# 2 2 b red
# $yellow
# x y z
# 3 3 c yellow
正如 jay.sf 的評論所建議的,這可用于將此幀串列轉換為單個物件。雖然我一般不鼓勵它,但也許它最適合您的用例。
names(LOF) <- paste0("mydata_", names(LOF))
list2env(LOF, envir = globalenv())
# <environment: R_GlobalEnv> ### this can be safely ignored
ls()
# [1] "LOF" "mydata" "mydata_red" "mydata_yellow"
mydata_red
# x y z
# 1 1 a red
# 2 2 b red
uj5u.com熱心網友回復:
您的代碼作業正常。只需洗掉list,以便創建顏色名稱向量而不是串列。如果您只想要不同的值,請使用unique.
mydata <- data.frame(x = c(1,2,3), y = c('a','b','c'), z = c('red','red','yellow'))
colors <- unique(mydata$z)
for (i in 1:length(colors)) {
assign(paste0("mydata_",i), subset(mydata, z == colors[[i]]))
}
uj5u.com熱心網友回復:
在 tidyverse 中:
mydata %>% group_by(z) %>% group_map(~.x %>% mutate(z=.y$z))
[[1]]
# A tibble: 2 × 3
x y z
<dbl> <chr> <chr>
1 1 a red
2 2 b red
[[2]]
# A tibble: 1 × 3
x y z
<dbl> <chr> <chr>
1 3 c yellow
~.x %>% mutate(z = .y$z)乍一看可能有點奇怪。~創建一個 lambda(函式)。默認情況下,該.f引數group_map采用一個必需引數和一個可選引數。所需引數默認命名.x,它包含包含當前組的輸入資料框的子集。同樣,.y可選引數 包含定義當前組的單行。 group_map將定義的函式.f依次應用于每組輸入資料幀,并在串列中回傳結果。
mydata %>% group_by(z) %>% group_map(~.x %>% bind_cols(.y))
有同樣的效果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462025.html
