R:删除行但跳过NA

时间:2017-01-19 12:20:52

标签: r na

使用此代码,我假装删除a列中包含"TRUE"字样的行。

DATA2 <- DATA[!DATA$a == "TRUE”] 

但是,我有"TRUE""FALSE""NA"。当我运行此代码时,R也会删除NA。如何跳过此操作并仅删除“TRUE”行?

我已经尝试过这个,但没有成功......

DATA2 <- DATA[!DATA$a=='TRUE',na.rm= FALSE]

错误:

Error in `[.data.frame`(DATA, !DATA$a == "TRUE",  : 
  unused argument (na.rm = FALSE)

2 个答案:

答案 0 :(得分:3)

我创建了一些可重现的数据:

df <- data.frame(
  col1 = c(1:15), 
  col2=rep(c("TRUE","FALSE", "NA"),5), 
  stringsAsFactors = FALSE)

使用基数R,您可以这样做:

df2 <- df[df$col2 == "NA" | !df$col2 == "TRUE", ]

在dplyr:

library(dplyr)
df2 <- df %>% filter(col2 == "NA" | !col2 == "TRUE" )

输出:

> df2
   col1  col2
2     2 FALSE
3     3    NA
5     5 FALSE
6     6    NA
8     8 FALSE
9     9    NA
11   11 FALSE
12   12    NA
14   14 FALSE
15   15    NA

//编辑: 将NA值更改为问题中提供的字符串("NA")。

//注意:

如果您想将"TRUE"转换为TRUE,将"FALSE"转换为FALSE,将"NA"转换为NA,则可以执行此操作:< / p>

df_bool <- data.frame(
  col1 = df$col1, 
  col2 = as.logical(df$col2)
)

由于df_bool$col2将返回实际逻辑值而非字符串看起来像逻辑值,因此可以在if本身内使用它,而无需==用于TRUEFALSE值:

df2 <- df_bool[!df_bool$col2 | is.na(df_bool$col2), ]

答案 1 :(得分:0)

首先创建一些示例数据:

set.seed(1)
df = data.frame(x = runif(10), 
                y = runif(10), 
                z = sample(c('TRUE', 'FALSE', NA), 10, replace = TRUE),
       stringsAsFactors = FALSE) # Force to character, and not factor

我在这里使用的技巧是将NA替换为过滤器内的"FALSE"

df[!ifelse(is.na(df$z), 'FALSE', df$z) == 'TRUE',]
            x         y     z
1  0.26550866 0.2059746  <NA>
3  0.57285336 0.6870228 FALSE
6  0.89838968 0.4976992 FALSE
8  0.66079779 0.9919061 FALSE
9  0.62911404 0.3800352  <NA>
10 0.06178627 0.7774452 FALSE

我非常喜欢dplyr编程风格:

df %>% filter(ifelse(is.na(z), 'FALSE', z) != 'TRUE')
           x         y     z
1 0.26550866 0.2059746  <NA>
2 0.57285336 0.6870228 FALSE
3 0.89838968 0.4976992 FALSE
4 0.66079779 0.9919061 FALSE
5 0.62911404 0.3800352  <NA>
6 0.06178627 0.7774452 FALSE