r语言 - 根据列表中存储的列名和值从data.frame中选择条目



我有一个类似的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

最新更新