我有一个列表,其中所有列都具有相同的长度,
ll<-list("a"=c(1:5),
"b"=c(1:5)*10,
"c"="one","two","three","four","five")
我想删除ll$c=="one"
所有的行。对于数据框,我可以使用ll[- grep("one", ll$c),]
,但这对列表不起作用。
有没有办法将方法概括为列表工作?
答案 0 :(得分:2)
如果列表中的所有元素长度相同,那么您可能应该使用data.frame。但是,假设您要删除每个列表元素中与ll$c == "one"
的位置对应的元素,您可以使用以下lapply
。
lapply(ll, "[", ll$c != "one")
$a
[1] 2 3 4 5
$b
[1] 20 30 40 50
$c
[1] "two" "three" "four" "five"
第二个参数表示子集或提取函数,参见?&#34; [&#34;第三个参数用于向子集化函数提供与ll$c
(以及其余列表元素)长度相同的逻辑向量。
如果列表元素很多,那么最初计算逻辑向量然后重复引用它会更有效。
keepers <- ll$c != "one"
lapply(ll, "[", keepers)
数据强>
ll <-
structure(list(a = 1:5, b = c(10, 20, 30, 40, 50), c = c("one",
"two", "three", "four", "five")), .Names = c("a", "b", "c"))