如何替换表*中的NA值以用于所选列*?data.frame,data.table

jna*_*m27 71 replace r dataframe na data.table

有很多关于替换NA值的帖子.我知道可以用以下内容替换下表/框架中的NA:

x[is.na(x)]<-0
Run Code Online (Sandbox Code Playgroud)

但是,如果我想将其限制为仅某些列,该怎么办?让我给你看一个例子.

首先,让我们从数据集开始.

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))
Run Code Online (Sandbox Code Playgroud)

这使:

    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
Run Code Online (Sandbox Code Playgroud)

好的,所以我只想将替换限制为列'a'和'b'.我的尝试是:

x[is.na(x), 1:2]<-0
Run Code Online (Sandbox Code Playgroud)

和:

x[is.na(x[1:2])]<-0
Run Code Online (Sandbox Code Playgroud)

哪个不起作用.

我的data.table尝试,在哪里y<-data.table(x),显然永远不会起作用:

y[is.na(y[,list(a,b)]), ]
Run Code Online (Sandbox Code Playgroud)

我想在is.na参数中传递列,但显然不起作用.

我想在data.frame和data.table中执行此操作.我的最终目标是在'a'和'b'中将1:2重新编码为0:1,同时保持'c'的方式,因为它不是逻辑变量.我有一堆列,所以我不想一个接一个地做.而且,我只想知道如何做到这一点.

你有什么建议吗?

flo*_*del 96

你可以做:

x[, 1:2][is.na(x[, 1:2])] <- 0
Run Code Online (Sandbox Code Playgroud)

或更好(恕我直言),使用变量名称:

x[c("a", "b")][is.na(x[c("a", "b")])] <- 0
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,1:2或者c("a", "b")可以由预定义的矢量替换.

  • 可能是这样的:`x [,1:2] [x [,1:2] == 1] < - 0` (4认同)

edd*_*ddi 26

这适用于您的data.table版本:

for (col in c("a", "b")) y[is.na(get(col)), (col) := 0]
Run Code Online (Sandbox Code Playgroud)

另外,正如David Arenburg在下面指出的那样,你可以使用set(附带利益 - 你可以在data.frame或使用它data.table):

for (col in 1:2) set(x, which(is.na(x[[col]])), col, 0)
Run Code Online (Sandbox Code Playgroud)

  • `y [,(cols):= lapply(.SD,function(x){out < - x; out [is.na(out)] < - 0; out}),. SDcols = cols]`"skips"循环但是相当丑陋的IMO.刚提到,因为它至少符合`data.table`的`lapply` /`.SDcols`更新的"范例".我想我们也可以写`na.to.0 <-function(x){x [is.na(x)] < - 0; x}`然后做`y [,(cols):= lapply(.SD,na.to.0),. SDcols = cols]`... (3认同)

Rob*_*ald 15

现在,这在使用replace_na()的tidyr中是微不足道的.该函数似乎适用于data.tables和data.frames:

tidyr::replace_na(x, list(a=0, b=0))
Run Code Online (Sandbox Code Playgroud)


sbh*_*bha 5

以@Robert McDonald的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))
Run Code Online (Sandbox Code Playgroud)