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

时间:2011-06-22 08:43:30

标签: r

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

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行。

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

6 个答案:

答案 0 :(得分:87)

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

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

答案 1 :(得分:35)

如果你有空行而不是NA,你可以这样做:

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

删除(NAs和空):

dotnet watch

答案 2 :(得分:3)

这里有一些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

答案 3 :(得分:2)

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

myData %>% remove_empty("rows")

答案 4 :(得分:0)

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

pct

其中drop_rows_all_na <- function(x, pct=1) x[!rowSums(is.na(x)) >= ncol(x)*pct,] 是一个数据帧,而x是您要摆脱的pct填充数据的阈值。

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

的再行行

答案 5 :(得分:0)

如果您只想要一个方便的函数包装器,这里还有另一个答案。此外,上述许多解决方案都删除了包含任何 NA 的行,而这个解决方案仅删除了所有 NA 的行。

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

rmNArows<-function(d){
goodRows<-apply(d,1,function(x) sum(is.na(x))!=ncol(d))
d[goodRows,]
}

rmNArows(data)