在R中删除数据文件的空行


79

我有一个空行的数据集。我想删除它们:

myData<-myData[-which(apply(myData,1,function(x)all(is.na(x)))),]

可以。但是现在我想在数据中添加一列并初始化第一个值:

myData$newCol[1] <- -999

Error in `$<-.data.frame`(`*tmp*`, "newCol", value = -999) : 
  replacement has 1 rows, data has 0

不幸的是,这是行不通的,我也不是很清楚为什么,我也无法解决。当我使用以下命令一次删除一行时,它起作用了:

TgData = TgData[2:nrow(TgData),]

或类似的东西。

当我仅使用前13.000行时,它也可以工作。

但是它不能用于我的实际数据(32.000行)。

我做错什么了?这对我来说似乎毫无意义。


Answers:


104

我假设您要删除所有不适用的行。然后,您可以执行以下操作:

data <- rbind(c(1,2,3), c(1, NA, 4), c(4,6,7), c(NA, NA, NA), c(4, 8, NA)) # sample data
data
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1   NA    4
[3,]    4    6    7
[4,]   NA   NA   NA
[5,]    4    8   NA

data[rowSums(is.na(data)) != ncol(data),]
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1   NA    4
[3,]    4    6    7
[4,]    4    8   NA

如果要删除具有至少一个NA的行,只需更改条件:

data[rowSums(is.na(data)) == 0,]
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    6    7

32
第二种情况也可以通过:处理data[complete.cases(data),]
Joshua Ulrich

@JoshuaUlrich Thx为您提供帮助!只是为了理解?为什么,data[complete.cases(data),]代码末尾放a ?
Anna.Klee 2014年

1
@mrquad,这意味着您正在按行设置子集;参见stackoverflow.com/a/17052459/2152245
马特

54

如果您有空行而不是NA,则可以执行以下操作:

data[!apply(data == "", 1, all),]

删除两者(NA和空白):

data <- data[!apply(is.na(data) | data == "", 1, all),]

10

以下是一些dplyr选项:

# sample data
df <- data.frame(a = c('1', NA, '3', NA), b = c('a', 'b', 'c', NA), c = c('e', 'f', 'g', NA))

library(dplyr)

# remove rows where all values are NA:
df %>% filter_all(any_vars(!is.na(.)))
df %>% filter_all(any_vars(complete.cases(.)))  


# remove rows where only some values are NA:
df %>% filter_all(all_vars(!is.na(.)))
df %>% filter_all(all_vars(complete.cases(.)))  

# or more succinctly:
df %>% filter(complete.cases(.))  
df %>% na.omit

# dplyr and tidyr:
library(tidyr)
df %>% drop_na

1
na.omit()和drop_na()均不返回非NA行。

7

NA使用janitor包的s行的替代解决方案

myData %>% remove_empty("rows")

1
这是最简单的解决方案,对我有用-谢谢!

2

这与上面的某些答案类似,但是通过此操作,您可以指定是否要删除缺失值百分比大于或等于给定百分比的行(使用参数pct

drop_rows_all_na <- function(x, pct=1) x[!rowSums(is.na(x)) >= ncol(x)*pct,]

x数据框在哪里,是要摆脱的填充数据pct的阈值NA

pct = 1表示删除具有其值100%的行NApct = .5表示具有至少一半值的重排行NA


如何在df上使用此FUN?
克希季·曼维利卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.