首页 文章

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

提问于
浏览
1

我有一个数据框,其中包括一个单独的标识符(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 回答

  • 3

    (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
    
  • 2

    这是使用 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

相关问题