빈 셀을 "NA"로 변경
여기 제 데이터 링크가 있습니다.
제 목표는 범주형 또는 숫자 값에 관계없이 모든 빈 셀에 "NA"를 할당하는 것입니다.na.sk=sk를 사용하고 있습니다.그러나 모든 빈 셀에 NA를 할당하는 것은 아닙니다.
## reading the data
dat <- read.csv("data2.csv")
head(dat)
mon hr acc alc sex spd axles door reg cond1 drug1
1 8 21 No Control TRUE F 0 2 2 Physical Impairment (Eyes, Ear, Limb) A
2 7 20 No Control FALSE M 900 2 2 Inattentive D
3 3 9 No Control FALSE F 100 2 2 2004 Normal D
4 1 15 No Control FALSE M 0 2 2 Physical Impairment (Eyes, Ear, Limb) D
5 4 21 No Control FALSE 25 NA NA D
6 4 20 No Control NA F 30 2 4 Drinking Alcohol - Impaired D
inj1 PED_STATE st rac1
1 Fatal <NA> F <NA>
2 Moderate <NA> F <NA>
3 Moderate <NA> M <NA>
4 Complaint <NA> M <NA>
5 Complaint <NA> F <NA>
6 Moderate <NA> M <NA>
## using na.strings
dat2 <- read.csv("data2.csv", header=T, na.strings="")
head(dat2)
mon hr acc alc sex spd axles door reg cond1 drug1
1 8 21 No Control TRUE F 0 2 2 <NA> Physical Impairment (Eyes, Ear, Limb) A
2 7 20 No Control FALSE M 900 2 2 <NA> Inattentive D
3 3 9 No Control FALSE F 100 2 2 2004 Normal D
4 1 15 No Control FALSE M 0 2 2 <NA> Physical Impairment (Eyes, Ear, Limb) D
5 4 21 No Control FALSE 25 NA NA <NA> <NA> D
6 4 20 No Control NA F 30 2 4 <NA> Drinking Alcohol - Impaired D
inj1 PED_STATE st rac1
1 Fatal NA F NA
2 Moderate NA F NA
3 Moderate NA M NA
4 Complaint NA M NA
5 Complaint NA F NA
6 Moderate NA M NA
제 생각에 당신은 5열 "성" 열을 말하는 것 같습니다.data2.csv 파일에서 셀에 공백이 포함되어 있기 때문에 R에 의해 빈 것으로 간주되지 않을 수 있습니다.
또한 5행 열 "축" 및 "문"에서 data2.csv에서 읽은 원래 값이 "NA" 문자열이라는 것을 알게 되었습니다.당신은 아마도 그것들을 na.string으로 취급하고 싶을 것입니다.이를 위해,
dat2 <- read.csv("data2.csv", header=T, na.strings=c("","NA"))
편집:
당신의 데이터 2.csv를 다운로드했습니다.예, 5열 "성" 열에 공백이 있습니다.그래서 당신은 원합니다.
na.strings=c(""," ","NA")
이것이 효과가 있을 것입니다.
dat <- dat %>% mutate_all(na_if,"")
gsub을 사용하여 "" 또는 공백과 같이 빈 여러 개의 돌연변이를 대체하여 NA가 될 수 있습니다.
data= data.frame(cats=c('', ' ', 'meow'), dogs=c("woof", " ", NA))
apply(data, 2, function(x) gsub("^$|^ $", NA, x))
다음을 사용하여 보다 눈에 잘 띄는 솔루션dplyr
것입니다.
require(dplyr)
## fake blank cells
iris[1,1]=""
## define a helper function
empty_as_na <- function(x){
if("factor" %in% class(x)) x <- as.character(x) ## since ifelse wont work with factors
ifelse(as.character(x)!="", x, NA)
}
## transform all columns
iris %>% mutate_each(funs(empty_as_na))
수정 사항을 열의 하위 집합에만 적용하려면 dplyr의 열 일치 구문을 사용하여 관심 열을 지정할 수 있습니다.예:mutate_each(funs(empty_as_na), matches("Width"), Species)
테이블에 날짜가 포함되어 있는 경우에는 보다 안전한 버전의 유형을 사용하는 것을 고려해야 합니다.ifelse
저는 최근에 비슷한 문제에 부딪혔고, 이것이 저에게 효과가 있었습니다.
변수가 숫자인 경우 단순df$Var[df$Var == ""] <- NA
충분할 겁니다.에 변수를 대체해야 합니다.""
원하는 값을 가진 셀을 인자로 다시 변환합니다., 여러분의 그서좋예로은, 당의신래.Sex
이 될 것 셀을 같이 .
df$Var <- as.character(df$Var)
df$Var[df$Var==""] <- NA
df$Var <- as.factor(df$Var)
(dplyr 1.0.0) 기준으로 사용할 수 있습니다.across()
참고: 때때로 사용NA
해야 할 도 있습니다.NA
를 들어, 이에는 를예들이경는에우어는▁be에▁for▁would경우이가 됩니다.NA_character_
된 첩된우의 ifelse()
할 수 은 다음과 같습니다.case_when()
.
모든 열의 경우:
dat <- dat %>%
mutate(across(everything(), ~ifelse(.=="", NA, as.character(.))))
개별 열의 경우:
dat <- dat %>%
mutate(across(c("Age","Gender"), ~ifelse(.=="", NA, as.character(.))))
(상기 dplyr 0.8.0)부터는 이를 작성하는 방식이 변경되었습니다.그 전에는funs()
.funs (funs(name = f(.))
에 에.funs
이제 우리는 사용합니다.list (list(name = ~f(.)))
열 이름을 나열하는 훨씬 간단한 방법도 있습니다!(열 이름과 열 인덱스 작업 모두).
dat <- dat %>%
mutate_at(.vars = c("Age","Gender"),
.funs = list(~ifelse(.=="", NA, as.character(.))))
원본 답변:
사용할 수도 있습니다.mutate_at
dplyr
dat <- dat %>%
mutate_at(vars(colnames(.)),
.funs = funs(ifelse(.=="", NA, as.character(.))))
변경할 개별 열 선택:
dat <- dat %>%
mutate_at(vars(colnames(.)[names(.) %in% c("Age","Gender")]),
.funs = funs(ifelse(.=="", NA, as.character(.))))
업데이트된 답변 dplyr over()를 활용하여 @camnesia의 훌륭한 옵션을 구축하는 데 유용한 몇 가지 추가 옵션:
na_if() 사용
mutate(across(c("Age","Gender"), ~na_if(., "")))
.
또한 dplyr 선택기를 사용하면 c(")로 열을 지정하는 것 외에도 방황하는 사람들에게 주목할 가치가 있습니다.
mutate(across(starts_with("x_"), ~na_if(., "")))
.
마지막으로, NA로 바꾸려는 값이 여러 개인 경우 여기서 replace()도 좋습니다.
바꾸기() 사용:
mutate(across(everything(), ~replace(., . %in% c("N.A.", "NA", "N/A", ""), NA)))
원래 답변은 이미 모든 사람이 답을 가지고 있다고 생각하지만, 누군가가 찾아 올 경우, dplyrna_if()가 언급된 것들 중 더 효율적일 것입니다.
# Import CSV, convert all 'blank' cells to NA
dat <- read.csv("data2.csv") %>% na_if("")
다음은 리더의 read_delim 함수를 활용한 추가 접근법입니다.방금 받았습니다(아마 널리 알려져 있을 것입니다만, 향후 사용자를 위해 여기에 보관하겠습니다)CSV 파일에서 모든 유형의 빈 값과 NA 관련 값을 캡처할 수 있으므로 위의 값보다 훨씬 단순하고 유용합니다.
dat <- read_csv("data2.csv", na = c("", "NA", "N/A"))
리더 버전의 밑줄과 read_csv의 기본 R "."을 비교합니다.
이것이 게시물을 돌아다니는 누군가에게 도움이 되기를 바랍니다!
이것이 (코드의 단순성과 속도를 위한) 최선의 방법이라고 생각합니다.다음은 "data"라는 데이터 집합의 모든 빈칸을 NA로 대체하는 것입니다.
data[data==""] <- NA
외부 파일을 읽기 위해 헤이븐 또는 외부 패키지를 사용하는 경우, 제 기능은 요인, 문자 벡터 및 잠재적 속성을 고려합니다.또한 서로 다른 자체 정의 na.string을 일치시킬 수 있습니다.열을 모든열변려면래사피용니다합를환하을▁la▁use다▁to▁simplyppy니:를 사용합니다.df[] = lapply(df, blank2na, na.strings=c('','NA','na','N/A','n/a','NaN','nan'))
추가 의견 보기:
#' Replaces blank-ish elements of a factor or character vector to NA
#' @description Replaces blank-ish elements of a factor or character vector to NA
#' @param x a vector of factor or character or any type
#' @param na.strings case sensitive strings that will be coverted to NA. The function will do a trimws(x,'both') before conversion. If NULL, do only trimws, no conversion to NA.
#' @return Returns a vector trimws (always for factor, character) and NA converted (if matching na.strings). Attributes will also be kept ('label','labels', 'value.labels').
#' @seealso \code{\link{ez.nan2na}}
#' @export
blank2na = function(x,na.strings=c('','.','NA','na','N/A','n/a','NaN','nan')) {
if (is.factor(x)) {
lab = attr(x, 'label', exact = T)
labs1 <- attr(x, 'labels', exact = T)
labs2 <- attr(x, 'value.labels', exact = T)
# trimws will convert factor to character
x = trimws(x,'both')
if (! is.null(lab)) lab = trimws(lab,'both')
if (! is.null(labs1)) labs1 = trimws(labs1,'both')
if (! is.null(labs2)) labs2 = trimws(labs2,'both')
if (!is.null(na.strings)) {
# convert to NA
x[x %in% na.strings] = NA
# also remember to remove na.strings from value labels
labs1 = labs1[! labs1 %in% na.strings]
labs2 = labs2[! labs2 %in% na.strings]
}
# the levels will be reset here
x = factor(x)
if (! is.null(lab)) attr(x, 'label') <- lab
if (! is.null(labs1)) attr(x, 'labels') <- labs1
if (! is.null(labs2)) attr(x, 'value.labels') <- labs2
} else if (is.character(x)) {
lab = attr(x, 'label', exact = T)
labs1 <- attr(x, 'labels', exact = T)
labs2 <- attr(x, 'value.labels', exact = T)
# trimws will convert factor to character
x = trimws(x,'both')
if (! is.null(lab)) lab = trimws(lab,'both')
if (! is.null(labs1)) labs1 = trimws(labs1,'both')
if (! is.null(labs2)) labs2 = trimws(labs2,'both')
if (!is.null(na.strings)) {
# convert to NA
x[x %in% na.strings] = NA
# also remember to remove na.strings from value labels
labs1 = labs1[! labs1 %in% na.strings]
labs2 = labs2[! labs2 %in% na.strings]
}
if (! is.null(lab)) attr(x, 'label') <- lab
if (! is.null(labs1)) attr(x, 'labels') <- labs1
if (! is.null(labs2)) attr(x, 'value.labels') <- labs2
} else {
x = x
}
return(x)
}
위의 많은 옵션들이 잘 작동하지만, 저는 목표가 아닌 변수들이 강제적으로chr
문제가 있는사용.ifelse
그리고.grepl
에 내에lapply
제한된 테스트에서 이 오프타겟 효과를 해결합니다.의 정규 용의키 에서 사용하는 것.grepl
:
set.seed(42)
x1 <- sample(c("a","b"," ", "a a", NA), 10, TRUE)
x2 <- sample(c(rnorm(length(x1),0, 1), NA), length(x1), TRUE)
df <- data.frame(x1, x2, stringsAsFactors = FALSE)
캐릭터 클래스에 대한 강제성 문제:
df2 <- lapply(df, function(x) gsub("^$|^ $", NA, x))
lapply(df2, class)
$x1
"
$x2 [1] "캐릭터"
ifelse를 사용한 해상도:
df3 <- lapply(df, function(x) ifelse(grepl("^$|^ $", x)==TRUE, NA, x))
lapply(df3, class)
$x1
"
$x2[1] "할인"
이것은 나에게 효과가 있습니다.
dataset <- read.csv(file = "data.csv",header=TRUE,fill = T,na.strings = "")
다음과 같이 돌연변이를 사용할 수도 마찬가지로case_when
:
dat <- dat %>% mutate(sex = case_when(sex == "" ~ "NA",TRUE ~ sex))
당신은 그냥 사용할 수 없습니까?
dat <- read.csv("data2.csv",na.strings=" ",header=TRUE)
데이터를 읽을 때 모든 빈칸을 NA로 변환해야 합니다. 인용문 사이에 공백을 두어야 합니다.
data.table 방식을 사용한 솔루션에 대해 궁금해하는 분들을 위해, 제가 작성한 기능이 제 Github에서 제공됩니다.
library(devtools)
source_url("https://github.com/YoannPa/Miscellaneous/blob/master/datatable_pattern_substitution.R?raw=TRUE")
dt.sub(DT = dat2, pattern = "^$|^ $",replacement = NA)
dat2
함수는 각 열을 통과하여 패턴 일치가 포함된 열을 식별합니다.그리고나서gsub()
패턴에 일치하는 항목이 포함된 열에만 적용됩니다."^$|^ $"
시합을 대신하다NA
s.
저는 이 기능을 더 빨리 만들기 위해 계속해서 개선할 것입니다.
불러dplyr
설치하여 패키지화cran
r로
library(dplyr)
(file)$(colname)<-sub("-",NA,file$colname)
특정 열의 모든 빈 셀을 NA로 변환합니다.
열에 "-", ","가 포함된 경우 이와 같은 0은 빈 셀의 유형에 따라 코드에서 변경됩니다.
예를 들어 "-" 대신 ""와 같은 빈 셀이 표시되면 다음 코드를 사용합니다.
(file)$(colname)<-sub("", NA, file$colname)
언급URL : https://stackoverflow.com/questions/24172111/change-the-blank-cells-to-na
'code' 카테고리의 다른 글
파이프 의존성/요구사항을 나열할 수 있는 방법이 있습니까? (0) | 2023.07.17 |
---|---|
pandas.read_message 매개 변수 "sheet_name"이(가) 작동하지 않습니다. (0) | 2023.07.17 |
IndexError: 목록 인덱스가 범위를 벗어남, 데이터베이스에서 항목 1개를 가져오는 동안 오류가 발생했습니다. (0) | 2023.07.17 |
플라스크에 저장하지 않고 파일 데이터 읽기 (0) | 2023.07.17 |
numpy 배열에 0만 포함되어 있는지 테스트 (0) | 2023.07.17 |