我有一个类似的data.frame
:
mydf=data.frame(LETTERS=LETTERS, rev_letters=rev(letters), var1=c(rep('a',10),rep('b',10),rep('c',6)), value=1:26)
> head(mydf)
LETTERS rev_letters var1 value
1 A z a 1
2 B y a 2
3 C x a 3
4 D w a 4
5 E v a 5
6 F u a 6
我想选择与存储在列表中的列和值对应的行索引,就像这样:
mylist=list(LETTERS=c('A','M','X'), var1='b')
> mylist
$LETTERS
[1] "A" "M" "X"
$var1
[1] "b"
我想做一些类似下面的事情,但对于所有的列和值一次:
> which(mydf[,names(mylist)[1]] %in% mylist[[1]])
[1] 1 13 24
…或者作为TRUE/FALSE变量更好:
> mydf[,names(mylist)[1]] %in% mylist[[1]]
[1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
[25] FALSE FALSE
这个想法是最终用一个变量来表示列表中所有列和值的所有索引;在上面的例子中,结果将是:
> indexes
[1] 1 11 12 13 14 15 16 17 18 19 20 24
…或对应的TRUE/FALSE:
> indexes
[1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
[13] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE TRUE
[25] FALSE FALSE
谢谢!
With%in%
+sapply
:
mydf=data.frame(LETTERS=LETTERS, rev_letters=rev(letters), var1=c(rep('a',10),rep('b',10),rep('c',6)), value=1:26)
mylist = list(LETTERS = c('A','M','X'), var1 = 'b')
rowSums(sapply(names(mylist), function(x) mydf[[x]] %in% mylist[[x]])) != 0
# [1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#[11] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
#[21] FALSE FALSE FALSE TRUE FALSE FALSE
which(rowSums(sapply(names(mylist), function(x) mydf[[x]] %in% mylist[[x]])) != 0)
#[1] 1 11 12 13 14 15 16 17 18 19 20 24
遍历名称并使用:
sort(unique(unlist(sapply(names(mylist), function(i){
which(mydf[, i] %in% mylist[[ i ]])
}))))
# [1] 1 11 12 13 14 15 16 17 18 19 20 24