2015-01-08 45 views
1

我有一个数据帧,其包括单独的标识符(其是6个字母)和数字的向量的向量R:从矢量子集划分数据帧使用元件

我想使用元素的向量到子集它(再从另一个数据帧

这里取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)

写这让我觉得这一定很容易做,但我无法自己弄清楚,我试着查找类似的问题,但无法找到我正在寻找的东西。我希望有人能帮助我,建议其他职位或手册,以便我可以学习。谢谢!

+1

你必须用引号'“abazzz”',请不要'attach'数据集。在%的人使用''%即。 'df1 [df1 $ i%in%v,]' – akrun

回答

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 
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