繁体   English   中英

根据 R 中的条件(值)对嵌套列表进行子集化

[英]Subsetting nested lists based on condition (values) in R

我有一个很大的嵌套列表(命名列表列表)——下面给出了这样一个列表的示例。 我想创建一个新列表,其中只有包含 0 和 1 值的“co”向量的子列表将被保留,而只有 0 的子列表将被丢弃(例如 output 应该只包含第一,第三- 和第四个子组。我根据这个线程玩了 lapply 和 filter :

根据逻辑条件对列表中的元素进行子集化

但是,它抛出了错误。 我将不胜感激如何处理列表中的列表的提示。

# reprex
set.seed(123)

## empty lists
first_group <- list()
second_group <- list()
third_group <- list()
fourth_group <- list()

# dummy_vecs
values1 <- c(sample(120:730, 30, replace=TRUE))
coeff1 <- c(sample(0:1, 30, replace=TRUE))

values2 <- c(sample(50:810, 43, replace=TRUE))
coeff2 <- c(rep(0, 43))

values3 <- c(sample(510:730, 57, replace=TRUE))
coeff3 <- c(rep(0, 8), rep(1, 4), rep(0, 45))

values4 <- c(sample(123:770, 28, replace=TRUE))
coeff4 <- c(sample(0:1, 28, replace=TRUE))

## fill lists with values:
first_group[["val"]] <- values1
first_group[["co"]] <- coeff1

second_group[["val"]] <- values2
second_group[["co"]] <- coeff2

third_group[["val"]] <- values3
third_group[["co"]] <- coeff3

fourth_group[["val"]] <- values4
fourth_group[["co"]] <- coeff4

#concatenate lists:
dummy_list <- list()

dummy_list[["first-group"]] <- first_group
dummy_list[["second-group"]] <- second_group
dummy_list[["third-group"]] <- third_group
dummy_list[["fourth-group"]] <- fourth_group

rm(values1, values2, values3, values4, coeff1, coeff2, coeff3, coeff4, first_group, second_group, third_group, fourth_group)
gc()

#show list
print(dummy_list)
# create boolean for where condition is TRUE
cond <- sapply(dummy_list, function(x) any(0 %in% x$co) & any(1 %in% x$co))

# subset
dummy_list[cond]

您可以使用来自 base R 的Filter

Filter(function(x) sum(x$co) !=0, dummy_list)

或者你可以使用purrr

library(tidyverse)

dummy_list %>%
  keep( ~ sum(.$co) != 0)

Output

$`first-group`
$`first-group`$val
 [1] 534 582 298 645 314 237 418 348 363 133 493 721 722 210 467 474 145 638 545 330 709 712 674 492 262 663 609 142 428 254

$`first-group`$co
 [1] 0 0 1 1 0 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 1 1 1 1 0


$`third-group`
$`third-group`$val
 [1] 713 721 683 526 699 555 563 672 619 603 588 533 622 724 616 644 730 716 660 663 611 669 644 664 679 514 579 525 533 541 530 564 584 673 592 726 548 563 727
[40] 646 708 557 586 592 693 620 548 705 510 677 539 603 726 525 597 563 712

$`third-group`$co
 [1] 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


$`fourth-group`
$`fourth-group`$val
 [1] 142 317 286 174 656 299 676 206 645 755 514 424 719 741 711 552 550 372 551 520 650 503 667 162 644 595 322 247

$`fourth-group`$co
 [1] 0 0 0 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1

但是,如果您还想排除任何全部为1co ,那么我们可以添加一个额外的条件。

Filter(function(x) sum(x$co) !=0 & sum(x$co == 0) > 0, dummy_list)

purrr

dummy_list %>%
  keep( ~ sum(.$co) != 0 & sum(.$co == 0) > 0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM