根据特定条件从数据框列表中创建新列表

时间:2018-01-19 03:25:08

标签: r list

我有一个数据框列表,如何根据具体情况将它们分组到不同的列表中?

例如:

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)))

我正在努力将列表拆分成列表子集,特别是如何根据这些条件找到索引并将列表子集化为列表列表?

3 个答案:

答案 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解决方案,则只需根据condmaxrowsums过滤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)
}

enter image description here

制作群组功能:

make_groups(mylist, condition_table)

<强>用法:

{{1}}

enter image description here