【问题标题】:How to extract last, unique and consecutive values from a data frame如何从数据框中提取最后一个、唯一的和连续的值
【发布时间】:2019-04-29 03:40:46
【问题描述】:

我已经从一个 .txt 文件中提取了某些字符串和相应的行到一个数据框中。如何从中提取最后一个唯一的连续值到一个新的数据框中?

这里是示例 df:

```
Line <- c(seq(from = 1, length.out = 9, by = 421), 4211)
string <- rep(c("Plate 1", "Plate 2", " Plate 3"))
Text <- c(rep(string, length.out = 9), "Plate 3")

df <- data.frame(Line = Line,
                 Text = Text )
```

这就是我想要得到的:

```

my_df <- data.frame(Line = c(2527, 2948, 3369),
                    Text = c("Plate 1", "Plate 2", "Plate 3"))
```

我试着像这样切片:

```
df %>% group_by(Text) %>% slice(unique(last(n())))
```

但这会得到带有错误行的副本。

有没有办法查看 R 中的连续值,而不仅仅是删除最后一行?

【问题讨论】:

  • df %&gt;% group_by(Text) %&gt;% filter(row_number = n())
  • 嗨,桑尼,感谢您的快速回复。这段代码给了我一个错误。当我使用 ``` row_number() == n() ``` 时,代码给了我板 3 的错误行。它给了我 4211,而我需要前一个:3369
  • 请用正确的样本数据更新问题。
  • 感谢您指出,我刚刚做到了:)
  • 对于Plate 3,为什么不是4211?

标签: r


【解决方案1】:

n 定义为string 的长度,然后使用rollapplyr 查找等于trimws(string) 的序列右端的索引。取最后一个,用seq从它的右端点推导出对应的序列,最后用它下标df

library(zoo)

n <- length(string)
r <- rollapplyr(as.character(df$Text), n, identical, trimws(string), fill = FALSE)
df[seq(to = tail(which(r), 1), length = n), ]

给予:

  Line    Text
7 2527 Plate 1
8 2948 Plate 2
9 3369 Plate 3

【讨论】:

  • 我非常喜欢这个答案。跟进:当我有多个重复项时,这是否有效?
  • 该代码查找与trimws(string) 匹配的最后一次出现的连续元素,而不管那里还有什么,所以那里有什么其他垃圾字符串并不重要。尝试一些例子来满足自己。
【解决方案2】:

您可以从字符串中删除前导空格,然后使用rle 删除重复项

df$Text <- stringr::str_trim(df$Text)
df[cumsum(rle(df$Text)$lengths) > 1,] %>%
  group_by(Text) %>%
  filter(row_number() == n())
# A tibble: 3 x 2
# Groups:   Text [3]
   Line Text   
  <dbl> <chr>  
1  2527 Plate 1
2  2948 Plate 2
3  3369 Plate 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多