R:使用来自向量的元素对数据帧进行子集化

时间:2015-01-08 10:23:48

标签: r vector dataframe subset

我有一个数据框,其中包含单个标识符(6个字母)的矢量和数字矢量

我想使用从另一个数据框中获取的元素向量(再次为6个字母的标识符)对其进行子集化

这是我所做的(在简化版本中,我的数据框有超过200列和64行)

n = c(2, 3, 5, 7, 8, 1) 

i = c("abazzz", "bbaxxx", "ccbeee","dddfre", "sdtyuo", "loatvz" ) 

c = c(10, 2, 10, 2, 12, 34) 

df1 = data.frame(n, i, c) 

attach(example)

这是我想用于子集化的元素的载体:

v<- c("abazzz", "ccbeee", "lllaaa")

这就是我对子集

的所作所为
df2<-example[, i==abazzz | ccbeee | lllaaa]

这不起作用,我得到的错误是“abazzz”未找到(我尝试使用和不使用“”,我尝试使用命令子集,出现相同的错误)

此外,我想避免使用或运算符,因为我需要用于子集的向量有大约50个元素。所以,换句话说,我想做的是将df2子集化,以便仅提取那些已经使用其标识符出现在df1中的个体(df1中的列)

写这篇文章让我觉得这一定很容易做到,但我自己无法弄清楚,我试着查找类似的问题,却找不到我想要的东西。我希望有人可以帮助我,建议其他帖子或手册,以便我可以学习。谢谢!

2 个答案:

答案 0 :(得分:3)

这是使用data.table二进制搜索(效率)

的另一个不错的选择
library(data.table)
setkey(setDT(df1), i)[J(v), nomatch = 0]
#    n      i  c
# 1: 2 abazzz 10
# 2: 5 ccbeee 10

或者,如果您不想重新排序数据集并保持语法类似于基数R,则可以设置辅助密钥(由@Arun提供)

set2key(setDT(df1), i) 
df1[i %in% v]

dplyr(为简单起见)

library(dplyr)
df1 %>% filter(i %in% v)
#    n      i  c
# 1: 2 abazzz 10
# 2: 5 ccbeee 10

作为旁注:如评论中所述,从不使用attach

答案 1 :(得分:2)

<强>(1) 而不是

attach(df1)
df2<-df1[, i==abazzz | ccbeee | lllaaa]
detach(df1)

df2 <- with(df1, df1[i=="abazzz" | i=="ccbeee" | i=="lllaaa", ])

<强>(2)

with(df1, df1[i %in% v, ])

两者都屈服

#   n      i  c
# 1 2 abazzz 10
# 3 5 ccbeee 10