【问题标题】:R: subsetting dataframe using elements from a vectorR:使用向量中的元素对数据框进行子集化
【发布时间】:2015-03-06 10:19:43
【问题描述】:

我有一个数据框,其中包含单个标识符的向量(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”未找到(我尝试使用和不使用“”,我尝试使用命令子集,出现相同的错误)

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

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

【问题讨论】:

  • 您必须使用引号"abazzz",请不要使用attach 数据集。使用%in% 即。 df1[df1$i %in% v,]

标签: r vector dataframe subset


【解决方案1】:

这是使用data.tables 二进制搜索的另一个不错的选择(为了提高效率)

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

附带说明:如 cmets 中所述,从不使用attach

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2021-10-13
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多