programing

선택한 열에 대해 표에서 NA 값을 바꾸는 방법

codeshow 2023. 10. 14. 10:47
반응형

선택한 열에 대해 표에서 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

작동하지 않습니다.

내 데이터.table 시도, 어디서y<-data.table(x), 분명히 절대로 일을 하지 않을 겁니다

y[is.na(y[,list(a,b)]), ]

저는 is.na 인수 내부에 있는 열을 전달하고 싶지만, 그것은 분명히 효과가 없을 것입니다.

data.frame 및 data.table에서 이 작업을 수행하고 싶습니다.논리변수가 아니기 때문에 'c'를 그대로 유지하면서 'a'와 'b'에서 1:2~0:1을 기록하는 것이 제 최종 목표입니다.저는 칼럼이 많아서 일일이 하고 싶지 않아요.그리고 어떻게 하는지 알고 싶습니다.

무슨 제안이라도 있으세요?

다음을 수행할 수 있습니다.

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")를 미리 정의된 벡터로 대체할 수 있습니다.

@Robert McDonald's를 기반으로 한 빌딩tidyr::replace_na()대답하세요, 여기 몇 가지가 있습니다.dplyr열을 제어하기 위한 옵션NAs가 교체됨:

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))

편집 2020-06-15

부터data.table1.12.4 (2019년 10월),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)

이것은 이제 사소한 것입니다.tidyr와 함께replace_na(). 이 함수는 data.table 및 data.frame에 대해 작동하는 것으로 보입니다.

tidyr::replace_na(x, list(a=0, b=0))

이것이 더 간결한지는 확실하지 않지만, 이 기능은 또한 데이터의 선택된 열에서 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.tabletidyr::repalce_nanlapply

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열을 합치는 것!

data.table 에서를
y[, (cols):=lapply(.SD, function(i){i[is.na(i)] <- 0; i}), .SDcols = cols]
library(data.table)를 작성하기 y이 명령을 실행할 수 있습니다.

이것은 NA의 요인들을 다루기 위해 약간의 추가적인 필요가 있었습니다.

여기서 mutate_at 또는 mutate_if와 함께 사용할 수 있는 유용한 함수를 찾았습니다.

replace_factor_na <- function(x){
    x <- as.character(x)
    x <- if_else(is.na(x), 'NONE', x)
    x <- as.factor(x)
}

df <- df %>%
    mutate_at(
        vars(vector_of_column_names), 
        replace_factor_na
    )

또는 모든 요인 열에 적용:

df <- df %>%
  mutate_if(is.factor, replace_factor_na)

에 .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

sbha의 여기 @sbha 의, 가 .across()할 수 있는 능 1.0 dplyr함전 1.0)*_at()변형 및 기타):

# random data
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))
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tidyr)
# with the magrittr pipe
x %>% mutate(across(1:2, ~ replace_na(.x, 0)))
#>    a b  c
#> 1  2 2  5
#> 2  2 2  2
#> 3  1 0  5
#> 4  0 2  2
#> 5  1 2 NA
#> 6  1 2  3
#> 7  2 2  4
#> 8  2 1  4
#> 9  0 0  3
#> 10 2 0  1
# with the native pipe (since R 4.1)
x |> mutate(across(1:2, ~ replace_na(.x, 0)))
#>    a b  c
#> 1  2 2  5
#> 2  2 2  2
#> 3  1 0  5
#> 4  0 2  2
#> 5  1 2 NA
#> 6  1 2  3
#> 7  2 2  4
#> 8  2 1  4
#> 9  0 0  3
#> 10 2 0  1

2021-12-08년 repex 패키지에서 생성(v2.0.1)

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

반응형