我有一个数据框列表,如何根据具体情况将它们分组到不同的列表中?
例如:
mylist = list(matrix(rep(0,9),nrow=3),matrix(rep(c(0,1),9),nrow=3), matrix(rep(1,9),nrow=3), matrix(rep(c(0,1),9),nrow=3, byrow=T))
我正在尝试将这些数据框组合到新列表中,具体取决于它们的最大rowSums和colSums。例如,这些是条件:
cond = data.frame(group = c(1,2,3), maxrowsums = c(0, 3, 3), maxcolsums = c(0, 2, 3))
根据这些条件,mylist[[1]]
属于第1组,mylist[[2]]
属于第2组,mylist[[3]]
和mylist[[4]]
都属于第3组:
lapply(mylist, FUN=function(x) max(rowSums(x)))
lapply(mylist, FUN=function(x) max(colSums(x)))
我正在努力将列表拆分成列表子集,特别是如何根据这些条件找到索引并将列表子集化为列表列表?
答案 0 :(得分:0)
您可以根据您想要的条件使用真/假向量来对列表进行子集化吗?
mylist = list(matrix(rep(0,9),nrow=3),matrix(rep(c(0,1),9),nrow=3), matrix(rep(1,9),nrow=3), matrix(rep(c(0,1),9),nrow=3, byrow=T))
# subset where rowsums are equal to three
subsettedlist <- mylist[ unlist( lapply(mylist, FUN=function(x) max(rowSums(x))==3 ) ) ]
答案 1 :(得分:0)
这是一个tidyverse
解决方案。我们可以将数据框列表放入列表列中。
我们使用匹配获得每个数据帧的最大行/总和。然后我们将其加入cond
数据框,其中maxrowsums
相等且maxcolsums
相等。
library('tidyverse')
mylist %>%
enframe(name = 'df_id', value = 'df') %>%
mutate(
maxrowsums = map_dbl(df, ~max(rowSums(.))),
maxcolsums = map_dbl(df, ~max(colSums(.))),) %>%
left_join(cond)
#> Joining, by = c("maxrowsums", "maxcolsums")
#> # A tibble: 4 x 5
#> df_id df maxrowsums maxcolsums group
#> <int> <list> <dbl> <dbl> <dbl>
#> 1 1 <dbl [3 x 3]> 0 0 1
#> 2 2 <dbl [3 x 6]> 3 2 2
#> 3 3 <dbl [3 x 3]> 3 3 3
#> 4 4 <dbl [3 x 6]> 3 3 3
如果您需要基本R
解决方案,则只需根据cond
和maxrowsums
过滤maxcolsums
数据框。
lapply(mylist, FUN=function(x) {
maxrowsums <- max(rowSums(x))
maxcolsums <- max(colSums(x))
cond$group[maxrowsums == cond$maxrowsums & maxcolsums == cond$maxcolsums]
})
#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] 2
#>
#> [[3]]
#> [1] 3
#>
#> [[4]]
#> [1] 3
答案 2 :(得分:0)
数据:强>
condition_table = data.frame(group = c(1,2,3), maxrowsums = c(0, 3, 3), maxcolsums = c(0, 2, 3))
条件表:
make_groups <- function(mylist, condition_table) {
tmp_list <- list()
groupings <- list()
for(group in 1:nrow(condition_table)) {
max_row_cond <- condition_table[group,c('maxrowsums')]
max_col_cond <- condition_table[group,c('maxcolsums')]
tmp_list[group] <- list(sapply(mylist, function(x) { if(max(rowSums(x))==max_row_cond && max(colSums(x))==max_col_cond) { return(x) } }))
groupings[group] <- list(Filter(Negate(is.null), tmp_list[[group]]))
}
names(groupings) <- sapply(seq(1:3), function(x){ paste('Group: ', x, collapse='', sep='')})
return(groupings)
}
制作群组功能:
make_groups(mylist, condition_table)
<强>用法:强>
{{1}}