假设我有一个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"
有一种简单的方法吗?或者使用循环是跨列的子集的唯一方法?
答案 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"))