如何替换表*中的NA值以用于所选列*? data.frame,data.table
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何替换表*中的NA值以用于所选列*? data.frame,data.table相关的知识,希望对你有一定的参考价值。
有很多关于替换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
哪个不起作用。
我的data.table尝试,y<-data.table(x)
,显然永远不会起作用:
y[is.na(y[,list(a,b)]), ]
我想在is.na参数中传递列,但显然不起作用。
我想在data.frame和data.table中执行此操作。我的最终目标是在'a'和'b'中将1:2重新编码为0:1,同时保持'c'的方式,因为它不是逻辑变量。我有一堆列,所以我不想一个接一个地做。而且,我只想知道如何做到这一点。
你有什么建议吗?
你可以做:
x[, 1:2][is.na(x[, 1:2])] <- 0
或更好(恕我直言),使用变量名称:
x[c("a", "b")][is.na(x[c("a", "b")])] <- 0
在这两种情况下,1:2
或c("a", "b")
都可以用预定义的矢量代替。
这将适用于您的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)
现在,这在使用replace_na()的tidyr中是微不足道的。该函数似乎适用于data.tables和data.frames:
tidyr::replace_na(x, list(a=0, b=0))
不确定这是否更简洁,但此函数还将查找并允许在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
}
申请:
y[update.mat(y, c("a", "b"), is.na(y))] <- 0
该函数创建符合输入条件的所选列和行(单元格坐标)的矩阵(在本例中为is.na == TRUE)。
对于特定的列,有一个替代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
基于@Robert McDonald的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))
这对我来说很好
DataTable DT = new DataTable();
DT = DT.AsEnumerable().Select(R =>
{
R["Campo1"] = valor;
return (R);
}).ToArray().CopyToDataTable();
以上是关于如何替换表*中的NA值以用于所选列*? data.frame,data.table的主要内容,如果未能解决你的问题,请参考以下文章