R子集带有条件语句的列表

时间:2014-12-08 16:48:38

标签: r list subset

假设我有一个column变量,它由3组相同长度的变量组成。

x <- sample(1:10, 10, replace = T)
y <- sample(c("$","#","!"), 10, replace = T)
z <- sample(LETTERS, 10, replace = T)
column <- list(value = x, varA = y, varB = z)

> column
$value
 [1] 5 6 9 1 9 3 3 5 4 4

$varA
 [1] "$" "$" "!" "$" "!" "$" "#" "!" "!" "!"

$varB
 [1] "H" "V" "V" "S" "W" "K" "K" "Q" "T" "D"

假设我想过滤掉value > 5的所有值集。

在上面的示例中,返回值为

$value
 [1] 5 6 9 9 5

$varA
 [1] "$" "$" "!" "!" "!"

$varB
 [1] "H" "V" "V" "W" "Q"

有一种简单的方法吗?或者使用循环是跨列的子集的唯一方法?

2 个答案:

答案 0 :(得分:4)

如果所有变量都具有相同的长度,那么您的问题必须是合理的,那么您应该考虑使用数据框,然后允许您使用subset等函数来过滤所有变量一个条件的列:

> DF <- as.data.frame(column, stringsAsFactors=F)
> (DF.small <- subset(DF, value >= 5))
  value varA varB
2     8    #    X
3     6    $    H
5     7    #    J
6     6    !    H
7     7    $    F
8     9    $    I
9     7    !    E
> as.list(DF.small)
$value
[1] 8 6 7 6 7 9 7

$varA
[1] "#" "$" "#" "!" "$" "$" "!"

$varB
[1] "X" "H" "J" "H" "F" "I" "E"

请注意,这与您的完全不符,因为您没有设置种子。

答案 1 :(得分:3)

尝试

lapply(column, `[`, column$value >=5)
#   $value
#[1] 5 6 9 9 5

#$varA
#[1] "$" "$" "!" "!" "!"

#$varB
#[1] "H" "V" "V" "W" "Q"

或者

Map(`[` , column, list(column$value>=5))

数据

column <- structure(list(value = c(5, 6, 9, 1, 9, 3, 3, 5, 4, 4), varA = c("$", 
"$", "!", "$", "!", "$", "#", "!", "!", "!"), varB = c("H", "V", 
"V", "S", "W", "K", "K", "Q", "T", "D")), .Names = c("value", 
"varA", "varB"))