[r] 선택한 열에 대한 테이블의 NA 값을 바꾸는 방법

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.table1.12.4 OCT (2019 년), data.table이를 용이하게하는 두 가지 기능을 얻는다 : nafillsetnafill.

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