我有一个数据框,其中包含单个标识符(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中的列)
写这篇文章让我觉得这一定很容易做到,但我自己无法弄清楚,我试着查找类似的问题,却找不到我想要的东西。我希望有人可以帮助我,建议其他帖子或手册,以便我可以学习。谢谢!
答案 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