모든 값이 NA 인 데이터 프레임에서 열 제거 dataframe은 임의의가 열 등의 속성을 하고 각

나는 데이터 프레임에 문제가 정말 그 문제를 자신을 확인할 수 없습니다 : dataframe은 임의의가 열 등의 속성을 하고 각 행은 하나 개를 나타냅니다 데이터 세트를 .

질문 :
어떻게하는 어디에서 열을 제거 ALL 행 값이 NA는 ?



답변

이 시도:

df <- df[,colSums(is.na(df))<nrow(df)]


답변

지금까지 제공된 두 가지 접근 방식은 (다른 메모리 문제 중) 생성 is.na(df)하는 것과 같은 대용량 데이터 세트에서는 실패 합니다.df .

더 많은 메모리와 시간 효율적인 두 가지 접근법이 있습니다.

사용하는 접근법 Filter

Filter(function(x)!all(is.na(x)), df)

data.table을 사용하는 접근법 (일반적인 시간과 메모리 효율성을 위해)

library(data.table)
DT <- as.data.table(df)
DT[,which(unlist(lapply(DT, function(x)!all(is.na(x))))),with=F]

큰 데이터를 사용하는 예 (30 열, 1e6 행)

big_data <- replicate(10, data.frame(rep(NA, 1e6), sample(c(1:8,NA),1e6,T), sample(250,1e6,T)),simplify=F)
bd <- do.call(data.frame,big_data)
names(bd) <- paste0('X',seq_len(30))
DT <- as.data.table(bd)

system.time({df1 <- bd[,colSums(is.na(bd) < nrow(bd))]})
# error -- can't allocate vector of size ...
system.time({df2 <- bd[, !apply(is.na(bd), 2, all)]})
# error -- can't allocate vector of size ...
system.time({df3 <- Filter(function(x)!all(is.na(x)), bd)})
## user  system elapsed 
## 0.26    0.03    0.29 
system.time({DT1 <- DT[,which(unlist(lapply(DT, function(x)!all(is.na(x))))),with=F]})
## user  system elapsed 
## 0.14    0.03    0.18 


답변

dplyr지금이 select_if여기에 도움이 될 수있는 동사를 :

library(dplyr)
temp <- data.frame(x = 1:5, y = c(1,2,NA,4, 5), z = rep(NA, 5))
not_all_na <- function(x) any(!is.na(x))
not_any_na <- function(x) all(!is.na(x))

> temp
  x  y  z
1 1  1 NA
2 2  2 NA
3 3 NA NA
4 4  4 NA
5 5  5 NA

> temp %>% select_if(not_all_na)
  x  y
1 1  1
2 2  2
3 3 NA
4 4  4
5 5  5

> temp %>% select_if(not_any_na)
  x
1 1
2 2
3 3
4 4
5 5


답변

다른 방법은 apply()기능 을 사용하는 것입니다.

data.frame이있는 경우

df <- data.frame (var1 = c(1:7,NA),
                  var2 = c(1,2,1,3,4,NA,NA,9),
                  var3 = c(NA)
                  )

그러면 apply()어떤 열이 조건을 충족하는지 확인할 수 있으므로 apply접근 방식 만으로 Musa의 답변에서와 동일한 하위 설정을 수행 할 수 있습니다 .

> !apply (is.na(df), 2, all)
 var1  var2  var3
 TRUE  TRUE FALSE

> df[, !apply(is.na(df), 2, all)]
  var1 var2
1    1    1
2    2    2
3    3    1
4    4    3
5    5    4
6    6   NA
7    7   NA
8   NA    9


답변

게임에 늦었지만 janitor패키지 를 사용할 수도 있습니다 . 이 함수는 모두 NA 인 열을 제거하고 모두 NA 인 행을 제거하도록 변경 될 수 있습니다.

df <- janitor::remove_empty(df, which = "cols")


답변

df[sapply(df, function(x) all(is.na(x)))] <- NULL


답변

허용되는 답변은 숫자가 아닌 열에는 적용되지 않습니다. 에서 이 대답 , 다음은 서로 다른 데이터 유형을 포함하는 열이 작동

Filter(function(x) !all(is.na(x)), df)