R 如何替换表中选定列的NA值

R 如何替换表中选定列的NA值,r,replace,dataframe,data.table,na,R,Replace,Dataframe,Data.table,Na,有很多关于替换NA值的帖子。我知道可以用以下内容替换下表/框架中的NAs: x[is.na(x)]<-0 好的,所以我只想将替换限制为列“a”和“b”。我的尝试是: x[is.na(x), 1:2]<-0 我想在is.na参数中传递列,但这显然不起作用 我希望在data.frame和data.table中执行此操作。我的最终目标是在“a”和“b”中重新编码1:2到0:1,同时保持“c”不变,因为它不是逻辑变量。我有一大堆专栏,所以我不想一个接一个地写。我只是想知道怎么做 你有什么

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

x[is.na(x)]<-0
好的,所以我只想将替换限制为列“a”和“b”。我的尝试是:

x[is.na(x), 1:2]<-0
我想在is.na参数中传递列,但这显然不起作用

我希望在data.frame和data.table中执行此操作。我的最终目标是在“a”和“b”中重新编码1:2到0:1,同时保持“c”不变,因为它不是逻辑变量。我有一大堆专栏,所以我不想一个接一个地写。我只是想知道怎么做

你有什么建议吗?

你可以做:

x[, 1:2][is.na(x[, 1:2])] <- 0
x[,1:2][is.na(x[,1:2])]编辑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
对表进行操作(替换通过引用/就地进行)

这也将比其他方案更有效;参见
?nafill
,了解时间序列的
NA
插补的上一次观察结转(LOCF)和下一次观察结转(NOCB)版本的更多信息


这将适用于您的
数据。表
版本:

for (col in c("a", "b")) y[is.na(get(col)), (col) := 0]
或者,正如David Arenburg在下面指出的,您可以使用
set
(附带好处-您可以在
data.frame
data.table
上使用它):


不确定这是否更简洁,但此函数还将查找并允许在数据表的选定列中替换NAs(或任何您喜欢的值)。表:

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
}
update.mat这对我来说很好

DataTable DT = new DataTable();

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

对于特定列,有一个可选的
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
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")]

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

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

基于@Robert McDonald's
tidyr::replace_na()
answer,以下是一些
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))

我们可以使用
tidyr::repalce_na
函数和
lappy

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
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
string解决粘贴列。首先,我们用
替换a(x,”
,然后我们可以使用
stringr::str\u c
组合列

使用{data.table}和{stringr}非常方便

library(data.table)
library(stringr)

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

仅供参考

从data.table y开始,您可以写:

y[,(cols):=lapply(.SD,函数(i){i[is.na(i)]执行此任务。如果我要搜索“1”,该怎么办?我尝试对其进行更改,但无法使其工作。可能是这样的:
x[,1:2][x[,1:2]==1]@flodel为什么datatable
x
仅在进行赋值时才接受矩阵作为其第一个成员?此功能是否有文档记录?另外,我认为您在第二个示例中忘记了在带有列名的向量之前加逗号。@gickedabs,我认为您指的是矩阵索引(参见此示例),但它不仅限于赋值,还可用于提取数据。关于缺少的逗号:否。data.frames是列的列表,因此如果使用单个参数来
[
,它将提取指定的列(请参阅)。我希望这能回答您的问题,但以后请避免评论像这样的旧答案;而是发布一个新问题。
在这两种情况下,1:2或c(“a”、“b”)都可以被预定义的向量替换。
当我使用像这样的预定义向量时
x[Vpredefined][is.na(x[Vpredefined])]谢谢。我只是想知道,三年过去了,如果没有for循环,是否有办法做到以上几点?我想data.table团队会让这更简洁。谢谢。@info\u seekeR我不知道有什么更简洁的方法比flodel选择的答案更好。flodel的方法使用赋值运算符@MichaelChirico在您的评论的第一部分,您是否添加了步骤
out@MichaelChirico True!我完全忘记了nafill()这是R吗?看起来像C#使用此函数,我得到错误:
replace_na(,0):参数“value”中的错误缺少,没有默认值。
。有什么建议要更改吗?这对我很有用。谢谢!感谢您提供此代码片段,它可能会提供一些有限的、即时的帮助。A将通过显示这是一个很好的问题解决方案的原因,大大提高其长期价值,并将使它对其他simil的未来读者更有用ar问题。请在您的回答中添加一些解释,包括您所做的假设。
DataTable DT = new DataTable();

DT = DT.AsEnumerable().Select(R =>
{
      R["Campo1"] = valor;
      return (R);
}).ToArray().CopyToDataTable();
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
tidyr::replace_na(x, list(a=0, b=0))
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))
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")]
library(data.table)
library(stringr)

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