NA 값 대체에 대한 많은 게시물이 있습니다. 다음 표 / 프레임의 NA를 다음으로 대체 할 수 있다는 것을 알고 있습니다.
x[is.na(x)]<-0
그러나 특정 열로만 제한하려면 어떻게해야합니까? 예를 하나 보여 드리겠습니다.
먼저 데이터 세트부터 시작하겠습니다.
set.seed(1234)
x <- data.frame(a=sample(c(1,2,NA), 10, replace=T),
b=sample(c(1,2,NA), 10, replace=T),
c=sample(c(1:5,NA), 10, replace=T))
다음을 제공합니다.
a b c
1 1 NA 2
2 2 2 2
3 2 1 1
4 2 NA 1
5 NA 1 2
6 2 NA 5
7 1 1 4
8 1 1 NA
9 2 1 5
10 2 1 1
좋아, 그래서 ‘a’와 ‘b’열로만 교체를 제한하고 싶습니다. 내 시도는 :
x[is.na(x), 1:2]<-0
과:
x[is.na(x[1:2])]<-0
작동하지 않습니다.
내 data.table 시도 y<-data.table(x)
는 분명히 작동하지 않을 것입니다.
y[is.na(y[,list(a,b)]), ]
is.na 인수 내부에 열을 전달하고 싶지만 분명히 작동하지 않습니다.
data.frame과 data.table에서 이것을하고 싶습니다. 내 최종 목표는 ‘a’와 ‘b’에서 1 : 2를 0 : 1로 레코딩하고 ‘c’는 논리 변수가 아니기 때문에 그대로 유지하는 것입니다. 나는 많은 칼럼을 가지고 있으므로 하나씩하고 싶지 않습니다. 그리고이 작업을 수행하는 방법을 알고 싶습니다.
의견 있으십니까?
답변
넌 할 수있어:
x[, 1:2][is.na(x[, 1:2])] <- 0
또는 더 나은 (IMHO), 변수 이름 사용 :
x[c("a", "b")][is.na(x[c("a", "b")])] <- 0
두 경우 모두 1:2
또는 c("a", "b")
미리 정의 된 벡터로 대체 할 수 있습니다.
답변
2020-06-15 수정
이후 data.table
1.12.4 OCT (2019 년), data.table
이를 용이하게하는 두 가지 기능을 얻는다 : nafill
와 setnafill
.
nafill
열에서 작동합니다.
cols = c('a', 'b')
y[ , (cols) := lapply(.SD, nafill, fill=0), .SDcols = cols]
setnafill
테이블에서 작동 (대체는 참조 / 제자리에서 발생)
setnafill(y, cols=cols, fill=0)
# print y to show the effect
y[]
이것은 또한 다른 옵션보다 더 효율적입니다. 자세한 내용 ?nafill
은 시계열에 대한 대치의 LOCF (last-observation-carried-forward) 및 NOCB (Next-observation-carried-backward) 버전을 참조하십시오 NA
.
이것은 귀하의 data.table
버전에서 작동합니다 .
for (col in c("a", "b")) y[is.na(get(col)), (col) := 0]
또는 David Arenburg가 아래에서 지적했듯이 다음을 사용할 수 있습니다 set
(부차적 이점- data.frame
또는 에서 사용할 수 있음 data.table
).
for (col in 1:2) set(x, which(is.na(x[[col]])), col, 0)
답변
@Robert McDonald의 tidyr::replace_na()
답변 을 바탕으로 s가 대체 dplyr
되는 열을 제어하는 몇 가지 옵션이 있습니다 NA
.
library(tidyverse)
# by column type:
x %>%
mutate_if(is.numeric, ~replace_na(., 0))
# select columns defined in vars(col1, col2, ...):
x %>%
mutate_at(vars(a, b, c), ~replace_na(., 0))
# all columns:
x %>%
mutate_all(~replace_na(., 0))
답변
이것은 이제 replace_na ()로 깔끔하게 정리되었습니다. 이 함수는 data.tables 및 data.frames에서 작동하는 것으로 보입니다.
tidyr::replace_na(x, list(a=0, b=0))
답변
이것이 더 간결한 지 확실하지 않지만이 함수는 data.table의 선택한 열에서 NA (또는 원하는 값)를 찾고 대체 할 수도 있습니다.
update.mat <- function(dt, cols, criteria) {
require(data.table)
x <- as.data.frame(which(criteria==TRUE, arr.ind = TRUE))
y <- as.matrix(subset(x, x$col %in% which((names(dt) %in% cols), arr.ind = TRUE)))
y
}
적용하려면 :
y[update.mat(y, c("a", "b"), is.na(y))] <- 0
이 함수는 입력 기준 (이 경우 is.na == TRUE)을 충족하는 선택된 열과 행 (셀 좌표)의 행렬을 만듭니다.
답변
우리는 그것을 해결할 수 data.table
와 방법 tidyr::repalce_na
기능과lapply
library(data.table)
library(tidyr)
setDT(df)
df[,c("a","b","c"):=lapply(.SD,function(x) replace_na(x,0)),.SDcols=c("a","b","c")]
이런 식으로 우리는 또한 NA
문자열로 붙여 넣기 열을 해결할 수 있습니다 . 먼저 열을 결합 replace_na(x,"")
하는 stringr::str_c
데 사용할 수 있습니다 !
답변
특정 열에 대한 대안이 있습니다. sapply
DF <- data.frame(A = letters[1:5],
B = letters[6:10],
C = c(2, 5, NA, 8, NA))
DF_NEW <- sapply(seq(1, nrow(DF)),
function(i) ifelse(is.na(DF[i,3]) ==
TRUE,
0,
DF[i,3]))
DF[,3] <- DF_NEW
DF