如何在巨大的数据框中用零替换 NaN 值?
Posted
技术标签:
【中文标题】如何在巨大的数据框中用零替换 NaN 值?【英文标题】:How to replace NaN value with zero in a huge data frame? 【发布时间】:2013-08-11 02:46:45 【问题描述】:我尝试使用以下脚本将 NaN
值替换为零:
rapply( data123, f=function(x) ifelse(is.nan(x),0,x), how="replace" )
# [31] 0.00000000 -0.67994832 0.50287454 0.63979527 1.48410571 -2.90402836
NaN 值显示为零,但当我输入数据框的名称并尝试查看它时,该值仍为 NaN。
data123$contri_us
# [31] NaN -0.67994832 0.50287454 0.63979527 1.48410571 -2.90402836
我不确定rapply
命令是否真的在数据框中应用了调整,或者只是按照所示替换了值。
知道如何将NaN
的值实际更改为零吗?
【问题讨论】:
你不能只做data123[is.nan(data123)] <- 0
?
我试过了,但 R 给出了以下错误消息: > is.nan(data123) 中的错误:没有为类型“list”实现默认方法
【参考方案1】:
与is.na
不同,is.nan
似乎实际上没有数据帧的方法。所以,让我们解决这个问题!
is.nan.data.frame <- function(x)
do.call(cbind, lapply(x, is.nan))
data123[is.nan(data123)] <- 0
【讨论】:
你的底部函数应该是“is.nan.data.frame”。 @Dombey 这不是必需的;通过方法分派的魔力,is.nan.data.frame
将被自动调用。【参考方案2】:
其实在R中,这个操作很简单:
如果矩阵 'a' 包含一些 NaN,则只需使用以下代码将其替换为 0:
a <- matrix(c(1, NaN, 2, NaN), ncol=2, nrow=2)
a[is.nan(a)] <- 0
a
如果数据框 'b' 包含一些 NaN,则只需使用以下代码将其替换为 0:
#for a data.frame:
b <- data.frame(c1=c(1, NaN, 2), c2=c(NaN, 2, 7))
b[is.na(b)] <- 0
b
注意is.nan
是矩阵时与is.na
时是数据框时的区别。
在做
#...
b[is.nan(b)] <- 0
#...
yields: Error in is.nan(b) : default method not implemented for type 'list'
因为 b 是一个数据框。
注意:针对小而混乱的错别字进行了编辑
【讨论】:
这个解释是错误的。 NA 不是 NaN 的数据帧等价物。 错误答案。同意。 此答案适用于仅处理数字和 NaN,或者如果您想将 NA 视为 NaN,因为 is.na(NaN) == TRUE。【参考方案3】:以下应该做你想要的:
x <- data.frame(X1=sample(c(1:3,NaN), 200, replace=TRUE), X2=sample(c(4:6,NaN), 200, replace=TRUE))
head(x)
x <- replace(x, is.na(x), 0)
head(x)
【讨论】:
【参考方案4】:这是一个tidyverse
解决方案。我已经用NaN
和NA
生成了样本数据。第一列已完全完成。
df <- tibble(x = LETTERS[1:5],
y = c(1:3, NaN, 4),
z = c(rep(NaN, 3), NA, 5))
> df
# A tibble: 5 x 3
x y z
<chr> <dbl> <dbl>
1 A 1 NaN
2 B 2 NaN
3 C 3 NaN
4 D NaN NA
5 E 4 5
然后我们可以将mutate_all
和replace
应用于数据框:
> df %>%
+ mutate_all(~replace(., is.nan(.), 0))
# A tibble: 5 x 3
x y z
<chr> <dbl> <dbl>
1 A 1 0
2 B 2 0
3 C 3 0
4 D 0 NA
5 E 4 5
我们已将 NaN
值替换为零,并且既未触及 NA
值也未触及 x
列。
【讨论】:
以上是关于如何在巨大的数据框中用零替换 NaN 值?的主要内容,如果未能解决你的问题,请参考以下文章