首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何基于R中的行过滤行

如何基于R中的行过滤行
EN

Stack Overflow用户
提问于 2021-05-02 04:12:09
回答 3查看 232关注 0票数 0

我有这样的数据:

代码语言:javascript
复制
df <- data.frame(station = c("A", "A", "Bad", "A", "B", "Bad", "B", "C"),
  values = c(8.1, 3.3, NA, 9.1, 9.4, 6.5, 15.3, 7.8))

    station values
1       A    8.1
2       A    3.3
3     Bad     NA
4       A    9.1
5       B    9.4
6     Bad    6.5
7       B   15.3
8       C    7.8

我想删除站在“坏”的行上面的行。我最终也会删除电台“坏”的行,但我知道如何做到这一点,这是另外一个问题。

目前的输出应该如下所示:

代码语言:javascript
复制
output <- data.frame(station = c("A", "Bad", "A", "Bad", "B", "C"),
                 values = c(8.1, NA, 9.1, 6.5, 15.3, 7.8))

   station values
1       A    8.1
2     Bad     NA
3       A    9.1
4     Bad    6.5
5       B   15.3
6       C    7.8

到目前为止,我一直在尝试使用dplyr过滤器函数,其变化与以下类似:

代码语言:javascript
复制
output <- df %>% 
  filter(values != ([-1] == "Bad"))

我知道"-1“不是对上面的行进行索引的正确方法,那么正确的方法是什么呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-02 04:15:24

您可以使用lead

代码语言:javascript
复制
library(dplyr)

df %>% filter(lead(station, default = last(station)) != 'Bad')

#  station values
#1       A    8.1
#2     Bad     NA
#3       A    9.1
#4     Bad    6.5
#5       B   15.3
#6       C    7.8

或在R基和data.table中:

代码语言:javascript
复制
#Base R
subset(df, c(tail(station, -1) != 'Bad', TRUE))

#Data table
library(data.table)
setDT(df)[shift(station, fill = last(station), type = 'lead') != 'Bad']
票数 1
EN

Stack Overflow用户

发布于 2021-05-02 04:23:03

另一个基本的R解决方案是:

代码语言:javascript
复制
df[-(which(df$station == "Bad") - 1),]

输出

代码语言:javascript
复制
  station values
1       A    8.1
3     Bad     NA
4       A    9.1
6     Bad    6.5
7       B   15.3
8       C    7.8
票数 1
EN

Stack Overflow用户

发布于 2021-05-02 17:10:57

我们也可以

代码语言:javascript
复制
 subset(df, c(station[-1] != "Bad", TRUE))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67352911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档