【问题标题】:Subset first n occurrences of certain value in dataframe子集数据框中某些值的前 n 次出现
【发布时间】:2016-01-14 16:58:46
【问题描述】:

假设我有一个矩阵(或数据框):

1  5  8
3  4  9
3  9  6
6  9  3
3  1  2
4  7  2
3  8  6
3  2  7

我想只选择第一个条目为“3”的前三行,如下所示:

3  4  9
3  9  6
3  1  2

我很清楚如何提取以“3”开头的所有行,并且很清楚如何仅提取以“3”开头的第一行。

但一般来说,如何提取以“3”开头的前 n 行?

另外,如何只选择第 3 次和第 4 次出场,如下:

3  1  2
3  8  6

【问题讨论】:

    标签: r


    【解决方案1】:

    无需额外的包装:

    mydf[mydf$V1==3,][1:3,]
    

    结果:

      V1 V2 V3
    2  3  4  9
    3  3  9  6
    5  3  1  2
    

    当你需要第三和第四行时:

    mydf[mydf$V1==3,][3:4,]
    # or:
    mydf[mydf$V1==3,][c(3,4),]
    

    使用过的数据:

    mydf <- structure(list(V1 = c(1L, 3L, 3L, 6L, 3L, 4L, 3L, 3L), 
                           V2 = c(5L, 4L, 9L, 9L, 1L, 7L, 8L, 2L), 
                           V3 = c(8L, 9L, 6L, 3L, 2L, 2L, 6L, 7L)), 
                      .Names = c("V1", "V2", "V3"), class = "data.frame", row.names = c(NA, -8L))
    

    奖励材料:除了dplyr,您还可以使用data.table 非常有效地做到这一点(see this answer 用于在大型数据集上比较不同data.table 方法的速度):

    setDT(mydf)[V1==3, head(.SD,3)]
    # or:
    setDT(mydf)[V1==3, .SD[1:3]]
    

    【讨论】:

    • 谢谢你,雅普。我很感激这个答案,而不需要调用其他包。
    【解决方案2】:

    您可以使用 dplyr 执行类似的操作来提取该列的每个唯一值的前三行:

    library(dplyr)
    df %>% arrange(columnName) %>% group_by(columnName) %>% slice(1:3)
    

    如果你想只提取三行时那一列的值,你可以试试:

    df %>% filter(columnName == 3) %>% slice(1:3)
    

    如果你想要特定的行,你可以提供给切片为c(3, 4),例如。

    【讨论】:

      【解决方案3】:

      我们也可以使用subset

      head(subset(mydf, V1==3),3)
      

      更新

      如果我们还需要提取V1==3所在行的下方一行,

      i1 <- with(mydf, V1==3)
      mydf[sort(unique(c(which(i1),pmin(which(i1)+1L, nrow(mydf))))),]
      

      【讨论】:

      • 感谢您的意见。这完美!现在假设我想提取每一行,其中 (ColumnName == 3) 和每行下方的 1 行符合条件,无论其内容如何。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 2019-07-09
      相关资源
      最近更新 更多