【问题标题】:deleting rows without filtering other values删除行而不过滤其他值
【发布时间】:2018-11-29 00:28:51
【问题描述】:

假设我有一个这样的数据框:

NAME    YEAR      PERCENTAGE
A       2001        NA
A       2002        NA
A       2003        5.0
B       2001        3.3 
B       2002        2.3 
B       2003        NA 

我想通过选择特定的行来删除带有 NA 的行:

NAME    YEAR      PERCENTAGE
A       2003        5.0
B       2001        3.3 
B       2002        2.3 

然后将 B 更改为 A,预期输出如下:

NAME    YEAR      PERCENTAGE
A       2001        3.3 
A       2002        2.3 
A       2003        5.0

我试过subset(),但由于我有其他值,它会过滤其他应该保留的值。

【问题讨论】:

  • df[!is.na(df$PERCENTAGE),] 呢?
  • 您需要按YEAR 订购输出吗?您没有提到它,但是您的预期输出就是这种情况
  • 按姓名排序,然后按每个姓名的年份排序

标签: r dplyr subset


【解决方案1】:

使用库 dplyr,您可以访问多个函数(如 filter()arrange()mutate( )) 能够让您修改数据框:

# the dataframe    
df <- data.frame(
      NAME = rep(c('A', 'B'), each = 3),
      YEAR = rep(2001:2003, length = 6),
      PERC = c(NA, NA, 5, 3.3, 2.3, NA)
    )

# load the library
library(dplyr)


df %>% 
  filter(!is.na(PERC)) %>%                         # filter missing values
  arrange(YEAR) %>%                                # order according YEAR
  mutate(NAME = replace(NAME, NAME == 'B', 'A'))   # change values

# result
  NAME YEAR PERC
1    A 2001  3.3
2    A 2002  2.3
3    A 2003  5.0

【讨论】:

  • 这些都是dplyr的函数,所以library(dplyr)就够了。
【解决方案2】:

假设你的数据框被称为df:

library(dplyr)

df %>% na.omit() %>% mutate(NAME = "A")

结果:

  NAME YEAR PERC
1    A 2003  5.0
2    A 2001  3.3
3    A 2002  2.3

【讨论】:

  • 这适用于示例数据,但它会 (a) 省略任何列中为 NA 的行,并且 (b) 将任何名称更改为“A”,而不仅仅是“B”更改为“A” .
  • 不清楚这些是否是要求
  • 请注意,我同意你的看法:),另一个答案更笼统(+1)。但是根据问题中的信息,我使用了最少的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2018-09-30
  • 2016-09-14
  • 2022-11-19
  • 2021-11-21
  • 1970-01-01
相关资源
最近更新 更多