在数据框中子集前n个特定值的出现次数

3

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

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  1  2
3  8  6
3个回答

5

无需额外的包:

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 非常高效地完成这个任务(在大型数据集上,不同的 data.table 方法的速度比较请参见这个答案):

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

1
谢谢你,Jaap。我很感激你的回答,而且没有调用其他的包。 - el_dewey

2
您可以使用dplyr执行以下操作,以提取该列每个唯一值的前三行:
library(dplyr)
df %>% arrange(columnName) %>% group_by(columnName) %>% slice(1:3)

如果您想在该列的值为某个特定值时仅提取三行数据,您可以尝试以下方法:
df %>% filter(columnName == 3) %>% slice(1:3)

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


1
我们也可以使用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))))),]

1
谢谢您的输入。这个方法完美运作!现在,假设我想提取每一行其中(ColumnName == 3),以及符合条件的下一行(无论其内容如何)。 - el_dewey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接