【问题标题】:R: Subsetting data more efficientlyR:更有效地对数据进行子集化
【发布时间】:2015-11-20 18:05:29
【问题描述】:

我有一个数据集 df:

df=data.frame(rbind(c("A",1,1,"abc"),
                    c("B",0,0,"def"),
                    c("C",0,1,"hep"),
                    c("A",1,1,"hit"),
                    c("B",0,1,"occ"),
                    c("C",1,1,"tem"),
                    c("A",1,1,"twi"),
                    c("B",1,1,"twa"),
                    c("C",1,1,"mit"),
                    c("A",1,1,"mot"),
                    c("C",1,1,"mot"),
                    c("B",1,1,"mjak")))
names(df)=c("id","v1","v2","check")

我想在 DF 中创建一个 id 子集,其中包含“check”列中“ch.vars”向量中包含的值。

ch.vars=c("abc","hit","mot","twi","mjak")

如果一个 id 包含除 "ch.vars" 中给出的值之外的任何值,它们将从数据集中排除。例如,id B 和 C 在检查列中包含其他值,因此它们将被排除在子集。

这是我迄今为止尝试过的:

df$check.var=ifelse(df$check %in% ch.vars,1,0)
df=arrange(df,id)

st1=filter(df,check.var==0)
st1=as.character(unique(st1$id))

df2=df[!df$id %in% st1,]

> df2
  id v1 v2 check check.var
1  A  1  1   abc         1
2  A  1  1   hit         1
3  A  1  1   twi         1
4  A  1  1   mot         1

这可行,但我想知道是否有更有效的方法来做到这一点,即以更少的步骤实现结果。谢谢!

【问题讨论】:

    标签: r subset


    【解决方案1】:

    您可以使用 dplyr 包中的 group_byfilter 来做到这一点:

    library(dplyr)
    df2 = df %>%
      group_by(id) %>%
      filter(all(check %in% ch.vars))
    

    【讨论】:

      【解决方案2】:

      还有一个data.table 解决方案:

      library(data.table)
      data.table(df)[,.SD[all(check%in%ch.vars)],by="id"]
      #   id v1 v2 check
      #1:  A  1  1   abc
      #2:  A  1  1   hit
      #3:  A  1  1   twi
      #4:  A  1  1   mot
      

      您还可以将setkey 用于id 以使其更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        • 2016-10-29
        • 2019-09-26
        • 2014-02-20
        • 2021-12-04
        • 2016-09-28
        • 1970-01-01
        相关资源
        最近更新 更多