선택한 열에 대해 표에서 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
열을 제어하기 위한 옵션NA
s가 교체됨:
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.table
1.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.table
tidyr::repalce_na
nlapply
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
'programing' 카테고리의 다른 글
동일한 라인에서 날짜 및 시간 가져오기 (0) | 2023.10.19 |
---|---|
의사 요소의 적층 순서를 부모 요소 아래에 설정할 수 있습니까? (0) | 2023.10.14 |
데이터베이스 풀링이란 무엇입니까? (0) | 2023.10.14 |
signalR : /signalr/hubs가 생성되지 않음 (0) | 2023.10.14 |
CSS를 사용하여 텍스트를 미러링/플립할 수 있습니까? (0) | 2023.10.14 |