dplyr을 사용한 data.frame의 전체 사례 필터(대소문자별 삭제)
dplyr을 사용하여 전체 사례에 대한 data.frame을 필터링할 수 있습니까? complete.cases
물론 모든 변수 작업의 목록과 함께.그러나 이는 a) 변수가 많을 때는 장황하고 b) 변수 이름을 알 수 없을 때는 불가능합니다(예: data.frame을 처리하는 함수).
library(dplyr)
df = data.frame(
x1 = c(1,2,3,NA),
x2 = c(1,2,NA,5)
)
df %.%
filter(complete.cases(x1,x2))
사용해 보십시오.
df %>% na.omit
또는 다음과 같습니다.
df %>% filter(complete.cases(.))
또는 다음과 같습니다.
library(tidyr)
df %>% drop_na
한 변수의 결측값을 기준으로 필터링하려면 조건부:
df %>% filter(!is.na(x1))
또는
df %>% drop_na(x1)
다른 답변은 위의 솔루션을 나타냅니다.na.omit
속도는 훨씬 느리지만, 이 값은 생략된 행의 행 인덱스를 반환한다는 사실과 균형을 이루어야 합니다.na.action
위의 다른 솔루션은 속성을 사용하지 않습니다.
str(df %>% na.omit)
## 'data.frame': 2 obs. of 2 variables:
## $ x1: num 1 2
## $ x2: num 1 2
## - attr(*, "na.action")= 'omit' Named int 3 4
## ..- attr(*, "names")= chr "3" "4"
ADDED 최신 버전의 dplyr 및 주석을 반영하도록 업데이트되었습니다.
ADDED 최신 버전의 tidyr 및 주석을 반영하도록 업데이트되었습니다.
이것은 나에게 도움이 됩니다.
df %>%
filter(complete.cases(df))
아니면 조금 더 일반적인 것:
library(dplyr) # 0.4
df %>% filter(complete.cases(.))
이렇게 하면 데이터를 필터에 전달하기 전에 체인에서 수정할 수 있다는 이점이 있습니다.
열이 더 많은 또 다른 벤치마크:
set.seed(123)
x <- sample(1e5,1e5*26, replace = TRUE)
x[sample(seq_along(x), 1e3)] <- NA
df <- as.data.frame(matrix(x, ncol = 26))
library(microbenchmark)
microbenchmark(
na.omit = {df %>% na.omit},
filter.anonymous = {df %>% (function(x) filter(x, complete.cases(x)))},
rowSums = {df %>% filter(rowSums(is.na(.)) == 0L)},
filter = {df %>% filter(complete.cases(.))},
times = 20L,
unit = "relative")
#Unit: relative
# expr min lq median uq max neval
# na.omit 12.252048 11.248707 11.327005 11.0623422 12.823233 20
#filter.anonymous 1.149305 1.022891 1.013779 0.9948659 4.668691 20
# rowSums 2.281002 2.377807 2.420615 2.3467519 5.223077 20
# filter 1.000000 1.000000 1.000000 1.0000000 1.000000 20
다음은 그로텐디크의 답변에 대한 몇 가지 벤치마크 결과입니다. na.omit()는 다른 두 솔루션보다 20배 더 많은 시간이 소요됩니다.나는 dplyr이 필터의 일부로 이것에 대한 기능을 가지고 있다면 좋을 것 같습니다.
library('rbenchmark')
library('dplyr')
n = 5e6
n.na = 100000
df = data.frame(
x1 = sample(1:10, n, replace=TRUE),
x2 = sample(1:10, n, replace=TRUE)
)
df$x1[sample(1:n, n.na)] = NA
df$x2[sample(1:n, n.na)] = NA
benchmark(
df %>% filter(complete.cases(x1,x2)),
df %>% na.omit(),
df %>% (function(x) filter(x, complete.cases(x)))()
, replications=50)
# test replications elapsed relative
# 3 df %.% (function(x) filter(x, complete.cases(x)))() 50 5.422 1.000
# 1 df %.% filter(complete.cases(x1, x2)) 50 6.262 1.155
# 2 df %.% na.omit() 50 109.618 20.217
이것은 열을 지정할 수 있는 짧은 함수입니다(기본적으로 모든 것).dplyr::select
이해할 수 있음). NA 값이 없어야 합니다(판다 df.dropna()).
drop_na <- function(data, ...){
if (missing(...)){
f = complete.cases(data)
} else {
f <- complete.cases(select_(data, .dots = lazyeval::lazy_dots(...)))
}
filter(data, f)
}
[drop_na는 이제 tidyr의 일부입니다. 위 내용은 다음으로 대체할 수 있습니다.library("tidyr")
]
예:
library("dplyr")
df <- data.frame(a=c(1,2,3,4,NA), b=c(NA,1,2,3,4), ac=c(1,2,NA,3,4))
df %>% drop_na(a,b)
df %>% drop_na(starts_with("a"))
df %>% drop_na() # drops all rows with NAs
이것을 먹어보세요.
df[complete.cases(df),] #output to console
아니면 이마저도
df.complete <- df[complete.cases(df),] #assign to a new data.frame
위의 명령은 data.frame의 모든 열(변수)에 대한 완전성 검사를 수행합니다.
단지 완전성을 위해,dplyr::filter
완전히 피할 수 있지만 여전히 사용만으로 체인을 구성할 수 있습니다.magrittr:extract
(의 별칭)[
):
library(magrittr)
df = data.frame(
x1 = c(1,2,3,NA),
x2 = c(1,2,NA,5))
df %>%
extract(complete.cases(.), )
추가 보너스는 속도입니다. 이것은 가장 빠른 방법입니다.filter
그리고.na.omit
변형(@Miha Trosht 마이크로벤치마크를 사용하여 테스트).
dplyr >= 1.0.4
if_any
그리고.if_all
의 최신 버전에서 사용할 수 있습니다.dplyr
적용할across
- 의 유사 구문filter
기능.이는 데이터 프레임에 완전한 사례로 간주되지 않는 다른 변수가 있는 경우 유용할 수 있습니다.예를 들어, "x"로 시작하는 열에 누락되지 않은 행만 포함하려면 다음을 수행합니다.
library(dplyr)
df = data.frame(
x1 = c(1,2,3,NA),
x2 = c(1,2,NA,5),
y = c(NA, "A", "B", "C")
)
df %>%
dplyr::filter(if_all(starts_with("x"), ~!is.na(.)))
x1 x2 y
1 1 1 <NA>
2 2 2 A
이러한 기능에 대한 자세한 내용은 이 링크를 참조하십시오.
언급URL : https://stackoverflow.com/questions/22353633/filter-for-complete-cases-in-data-frame-using-dplyr-case-wise-deletion
'source' 카테고리의 다른 글
DOKER Spring Boot에 env 변수 전달 (0) | 2023.07.08 |
---|---|
Angular Material 2 테이블 서버 측면 페이지 (0) | 2023.07.03 |
집계 프레임워크에서 전체 타임스탬프가 제공될 때 날짜별로 집계하는 방법은 무엇입니까? (0) | 2023.07.03 |
배경이 투명한 matplotlib에서 플롯을 내보내는 방법은 무엇입니까? (0) | 2023.07.03 |
특정 단추에 기본 '입력'을 설정하는 방법 (0) | 2023.07.03 |