我有一个关于使用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
但它没有用。 (是的,我知道这是混合子集类型;我发现子集()更容易理解,但我认为它不能帮助我满足我的需要吗?)
答案 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