提取重复值的索引

时间:2017-11-20 22:25:52

标签: r dataframe

当列具有重复值时,如何提取特定的数据行?我的数据看起来像这样:我想提取x的每个重复结束的行(A 3 10,A 2 3等)或最后一个值的索引

Name    X   M
 A      1   1
 A      2   9
 A      3   10
 A      1   1
 A      2   3
 A      1   5
 A      2   6
 A      3   4
 A      4   5
 A      5   3
 B      1   1
 B      2   9
 B      3   10
 B      1   1
 B      2   3

预期输出

 Index  Name X   M
  3      A   3   10
  5      A   2   3
  10     A   5   3
  13     B   3   10
  15     B   2   3  

2 个答案:

答案 0 :(得分:1)

使用基础R duplicatedcumsum

dups <- !duplicated(cumsum(dat$X == 1), fromLast=TRUE)
cbind(dat[dups,], Index=which(dups))

#   Name X  M Index
#3     A 3 10     3
#5     A 2  3     5
#10    A 5  3    10
#13    B 3 10    13
#15    B 2  3    15

答案 1 :(得分:0)

使用dplyr的解决方案。

library(dplyr)

df2 <- df %>%
  mutate(Flag = ifelse(lead(X) < X, 1, 0)) %>%
  mutate(Index = 1:n()) %>%
  filter(Flag == 1 | is.na(Flag)) %>%
  select(Index, X, M)
df2
#   Index X  M
# 1     3 3 10
# 2     5 2  3
# 3    10 5  3
# 4    13 3 10
# 5    15 2  3

Flag是一列,显示A中的下一个数字是否小于之前的数字。如果TRUE,则Flag为1,否则为0.我们可以过滤Flag == 1或标记NA,即最后一行。 df2是最终过滤的数据框。

数据

df <- read.table(text = "Name    X   M
 A      1   1
 A      2   9
 A      3   10
 A      1   1
 A      2   3
 A      1   5
 A      2   6
 A      3   4
 A      4   5
 A      5   3
 B      1   1
 B      2   9
 B      3   10
 B      1   1
 B      2   3",
                 header = TRUE, stringsAsFactors = FALSE)