【问题标题】:In R, how do you subset rows of a dataframe based on values in a vector在 R 中,如何根据向量中的值对数据帧的行进行子集化
【发布时间】:2017-07-05 22:13:33
【问题描述】:

我想根据向量中包含的因子值生成一个子集。我已经将我的工作代码包含在一个简单的示例中。但是,如果我有很多列 (>10) 并且我不想使用“|”列出每一列怎么办? (或),有没有更好的方法来做到这一点?我下面的示例使用了字母,但我正在处理因素(人名)。

set.seed(37)
df <- data.frame(id1=sample(LETTERS, 20),id2=sample(LETTERS, 20))
L <- c("A","B","E")
subset(df, id1 %in% L | id2 %in% L )
   id1 id2
2    B   V
10   C   B
11   F   A
14   A   F
19   E   S

【问题讨论】:

    标签: r filter subset


    【解决方案1】:

    你可以使用Reduce来构造OR条件:

    subset(df, Reduce("|", lapply(df, `%in%`, L)))
    
    #   id1 id2
    #2    B   V
    #10   C   B
    #11   F   A
    #14   A   F
    #19   E   S
    

    或者使用rowSums检查每一行是否有匹配的字母:

    subset(df, rowSums(sapply(df, `%in%`, L)) != 0)
    
    #   id1 id2
    #2    B   V
    #10   C   B
    #11   F   A
    #14   A   F
    #19   E   S
    

    【讨论】:

    • 或带有data.tablesetDT(df)[df[, Reduce('|', lapply(.SD, %in%, L))]]的选项
    • 看起来应该是 '%in%'(带引号)。
    【解决方案2】:
    df[sort(unique(unlist(lapply(df, function(x) which(x %in% L))))),]
    #   id1 id2
    #2    B   V
    #10   C   B
    #11   F   A
    #14   A   F
    #19   E   S
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多