R 如何替换表中选定列的NA值
有很多关于替换NA值的帖子。我知道可以用以下内容替换下表/框架中的NAs: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”不变,因为它不是逻辑变量。我有一大堆专栏,所以我不想一个接一个地写。我只是想知道怎么做 你有什么
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'stidyr::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为什么datatablex
仅在进行赋值时才接受矩阵作为其第一个成员?此功能是否有文档记录?另外,我认为您在第二个示例中忘记了在带有列名的向量之前加逗号。@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)})]