如果任何列匹配一组值中的一个,则保留行

时间:2014-09-05 19:05:09

标签: r subset

我有一个关于使用R进行子集化的简单问题;我认为我很接近,但不能很好地得到它。基本上,我有25列兴趣和大约100个值。在其中一列中包含任何值的任何行,我想保留。简单的例子:

Values <- c(1,2,5)

col1 <- c(2,6,8,1,3,5)
col2 <- c(1,4,5,9,0,0)
col3 <- c('dog', 'cat', 'cat', 'pig', 'chicken', 'cat')
df <- cbind.data.frame(col1, col2, col3)

df1 <- subset(df, col1%in%Values)

(请注意,第三列是为了表示还有其他列,但我不需要将值与这些列匹配;保留的行仅取决于第1列和第2列)。我知道在这个简单的案例中我可以添加

| col2%in%Values

从第2列获取额外的行,但是有25列,我不想为每一行添加OR语句。我试过了

 file2011_test <- file2011[file2011[,9:33]%in%CO_codes] #real names of values

但它没有用。 (是的,我知道这是混合子集类型;我发现子集()更容易理解,但我认为它不能帮助我满足我的需要吗?)

2 个答案:

答案 0 :(得分:2)

可能你可以试试:

df[Reduce(`|`, lapply(as.data.frame(df), function(x) x %in% Values)),]
#        col1 col2
#[1,]    2    1
#[2,]    8    5
#[3,]    1    9
#[4,]    5    0

或者

 indx <- df %in% Values
 dim(indx) <- dim(df)
 df[!!rowSums(indx),]
 #        col1 col2
 # [1,]    2    1
 # [2,]    8    5
 # [3,]    1    9
 # [4,]    5    0

更新

使用新数据集

 df[Reduce(`|`, lapply(df[sapply(df, is.numeric)], function(x) x %in% Values)),]
 #     col1 col2 col3
 #1    2    1  dog
 #3    8    5  cat
 #4    1    9  pig
 #6    5    0  cat

答案 1 :(得分:0)

看一下data.table包。它非常直观,速度快100倍。

library(data.table)
df <- data.table(col1, col2, col3)
df[col1%in%Values | col2%in%Values]

#    col1 col2 col3
#1:    2    1  dog
#2:    8    5  cat
#3:    1    9  pig
#4:    5    0  cat

如果要对所有列执行此操作,可以使用以下命令执行此操作:

df[rowSums(sapply(df, '%in%', Values) )>0]
#   col1 col2 col3
#1:    2    1  dog
#2:    8    5  cat
#3:    1    9  pig
#4:    5    0  cat