【问题标题】:Replace NA zero dataframe: code not working替换 NA 零数据帧:代码不起作用
【发布时间】:2014-08-06 13:06:25
【问题描述】:

我正在寻找一种方法来用零替换我的数据框中的 NA,并在这里找到了一个很好的回复: How do I replace NA values with zeros in an R dataframe?

我使用 aL3xa 答案中的代码构建了一个示例矩阵,发现 NA 被替换得很好。 但是,当我将代码应用到自己的数据框时,它似乎不起作用:

sum(is.na(dat.sub))

[1] 453562

dat.sub[is.na(dat.sub)]

sum(is.na(dat.sub))

[1] 453562

谁能建议我做错了什么?

【问题讨论】:

  • 您需要提供reproducible example
  • 如果不能将0 强制转换为dat.sub 列类,它将无法正常工作。你所有的专栏都是factors吗?
  • @celiomsj 好的,但是会有一些警告信息吗?
  • @agenis 是的,它会产生警告。
  • @qwerty 好的,你能不能对你的数据执行 dat.sub

标签: r


【解决方案1】:

该命令适用于适当的数据帧:

ddf = structure(list(A = c(1L, NA, 3L), B = c(NA, 5L, NA), C = c(5L, 
NA, 7L)), .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA, 
-3L))

str(ddf)
'data.frame':   3 obs. of  3 variables:
 $ A: num  1 0 3
 $ B: num  0 5 0
 $ C: num  5 0 7

ddf
   A  B  C
1  1 NA  5
2 NA  5 NA
3  3 NA  7

ddf[is.na(ddf)] =0
ddf
  A B C
1 1 0 5
2 0 5 0
3 3 0 7

【讨论】:

    【解决方案2】:

    数据帧本质上是具有相同长度的向量列表。如果要更改数据框中的元素,则必须将更改应用于列出的向量之一。为此,您可以调用数据框对象 (df),就好像它是一个带有命名列的矩阵:

     df[is.na(df$dat.sub),"dat.sub"]<-0
    

    其中 dat.sub 是您要更改的向量的名称...或者您可以更改值:

     df$dat.sub[is.na(df$dat.sub)]<-0
    

    通过从数据框中调用选定的列表,也就是向量。一旦您可以通过这种方式执行此操作,您就可以开始使用apply 和/或lapply 将您的替换“应用”到数据框中的每个列表。

    【讨论】:

    • 这并不完全正确,像df[is.na(df)] = 0 这样的东西效果很好。
    猜你喜欢
    • 2014-04-10
    • 2023-02-23
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2019-11-05
    • 2015-12-19
    • 2021-06-27
    • 2011-12-31
    相关资源
    最近更新 更多