Program Tip

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

programtip 2020. 10. 29. 19:12
반응형

선택한 열에 대한 테이블의 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")미리 정의 된 벡터로 대체 할 수 있습니다.


이것은 귀하의 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)

이것은 이제 replace_na ()로 깔끔하게 정리되었습니다. 이 함수는 data.tables 및 data.frames에서 작동하는 것으로 보입니다.

tidyr::replace_na(x, list(a=0, b=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))

이것이 더 간결한 지 확실하지 않지만이 함수는 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)을 충족하는 선택된 열과 행 (셀 좌표)의 행렬을 만듭니다.


특정 열에 대한 대안이 있습니다. 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

We can solve it in data.table way with tidyr::repalce_na function and 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")]

In this way,we can also solve paste cloumns with NA string.First, we replace_na(x,""),then we can use stringr::str_c to combine columns!

{data.table} 및 {stringr}와 함께 사용하면 매우 편리합니다.

library(data.table)
library(stringr)

x[, lapply(.SD, function(xx) {str_replace_na(xx, 0)})]

참고로


이것은 나를 위해 잘 작동합니다

DataTable DT = new DataTable();

DT = DT.AsEnumerable().Select(R =>
{
      R["Campo1"] = valor;
      return (R);
}).ToArray().CopyToDataTable();

참고 URL : https://stackoverflow.com/questions/19379081/how-to-replace-na-values-in-a-table-for-selected-columns

반응형