R에서 데이터 파일의 빈 행 제거


82

빈 행이있는 데이터 세트가 있습니다. 제거하고 싶습니다.

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 행의 실제 데이터에서는 작동하지 않습니다.

내가 뭘 잘못 했어? 나에게 말이 안되는 것 같습니다.


답변:


106

모든 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

34
두 번째 경우는 다음을 통해 처리 할 수도 있습니다 data[complete.cases(data),]..
Joshua Ulrich

도움을 주신 @JoshuaUlrich Thx! 이해를 위해서? 코드 ,끝에 a를 두는 이유는 무엇 data[complete.cases(data),]입니까?
Anna.Klee 2014-08-13

1
@mrquad, 즉, 행으로 부분 집합 화한다는 의미입니다. stackoverflow.com/a/17052459/2152245를 참조하십시오 .
Matt

56

NA가 아닌 빈 행이있는 경우 다음을 수행 할 수 있습니다.

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

둘 다 제거하려면 (NA 및 비어 있음) :

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

13

다음은 몇 가지 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가 아닌 행을 반환하지 않습니다.

8

패키지를 NA사용 하는 s 행에 대한 대체 솔루션janitor

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 % 인 행을 제거하는 것을 의미합니다 NA. pct = .5값이 절반 이상인 remome 행을 의미합니다.NA


이 FUN을 df에서 사용하는 방법?
Kshitij Manvelikar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.