使用此代码,我假装删除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)
答案 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
本身内使用它,而无需==
用于TRUE
和FALSE
值:
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