在R中筛选只包含NA和/或数字的行的数据帧

  • 本文关键字:数字 数据帧 NA 筛选 包含 r
  • 更新时间 :
  • 英文 :


我有几个学区计划如何在各种类别中花钱的数据。NA意味着学校不打算在这一类别上花钱,而;X〃;或"$"-"或"######"这意味着学校计划花钱,但没有具体说明花多少钱。我想过滤我的数据,这样它只包括明确说明他们想在每个类别中花费多少的地区,所以可以有NA或数字,但在与支出类别相关的任何列中都没有其他字符。

这就是我试图做的:

#Sample data
district_name <- c("District A","District B","District C","District D")
x <- c(5,10,4,5)
y <- c(10,"X",NA,999)
z <- c(NA,30,"$ - ",NA)
df_test <- data.frame(district_name, x,y,z)
#Try to convert all the NAs to zeros, then all non-numerics to NA, then remove the NAs. 
df_test[is.na(df_test)] = 0
df_test[,2:4] = as.numeric(df[,2:4])
df_test[!is.na(df_test[,2:4]), ]

然而,我得到了这个错误:"list"对象不能被强制为类型"double">

我们可以使用if_all

library(dplyr)
library(stringr)
df_test %>%
filter(if_all(x:z,  ~ is.na(.x)|str_detect(.x, "^[0-9]+(\.[0-9]+)?$"))) %>% 
type.convert(as.is = TRUE)

-输出

district_name x   y  z
1    District A 5  10 NA
2    District D 5 999 NA

OP帖子中的错误是基于在数据帧上应用as.numeric,这需要一个矢量作为输入,即可以在循环中完成

df_test[2:4] <- lapply(df_test[2:4], as.numeric)