R 类型转换 NA 与字符串

R typecast NA vs string

我的一些代码有问题,我修复了它,但不完全理解错误的原因

代码如下:

for(i in 1:3){df = rbind.fill(z, data.frame(id=i,
data=if(is.null(x$results[[i]]$synopsis$data))    
{NA}else{x$results[[i]]$synopsis$data}))}

我遇到的问题是,如果第一个数据值确实为空,我会得到 NA 但对于第二个和第三个我会得到另一个 NA 或者如果有数据我不会得到它,我会得到 1.

如果第一个值是数据,那么我将获取数据,而对于其他两个值,我将获取 NA 或正确的数据。

我不是计算机科学家,但坐在我附近的开发人员(但不知道 R)建议这与 NA 和字符串的不同类型转换有关。为了解决这个问题,我将 NA 更改为 "0"(我想 "NA" 也可以)。

我只是想对正在发生的事情进行更彻底的解释。我的外行人的理解是,如果 NA 是第一个结果,那么每个结果都在那个 "format" 中,其中某些东西要么是 NA 要么不是,而不是被处理为 1 这有点像布尔响应?

示例:

my.list <- list(list(),structure(
     list(
         experience = structure(
             list(
                 start = "Hi"
             ),.Names = c("start")),
         `_meta` = structure(
             list(weight = 1L, `_sources` = list(structure(
                 list(`_origin` = "a"), .Names = "_origin"
             ))),.Names = c("weight", "_sources"))),.Names = c("experience", "_meta")))

my.list[[1]]$experience$start
    NULL
my.list[[2]]$experience$start
    [1] "Hi"


  df <- NULL
    for(i in 1:2){df = rbind.fill(df, data.frame(id=i,
data=if(is.null(my.list[[i]]$experience$start))                                                 
    {NA}else{my.list[[i]]$experience$start}))}

然后

  df2 <- NULL
for(i in 1:2){df2 = rbind.fill(df2, data.frame(id=i,                                               
data=if(is.null(my.list[[i]]$experience$start))                                                    
{"NA"}else{my.list[[i]]$experience$start}))}

结果:

df:              df2:

id data        id data
1   NA         1   NA
2   1          2   HI

奥利维亚,感谢您的澄清。 你快到了。当您循环时,实际上第一次迭代将确定输出 data.frame df.

data 的 class

在场景一中,一步步循环,你会有更好的想法:

df <- NULL
i=1
df = rbind.fill(df, data.frame(id=i,
    data=if(is.null(my.list[[i]]]$experience$start)) {NA}
    else{my.list[[i]]$experience$start}))
df

  id data
1  1   NA

然后,看看class of df$data

class(df$data)
[1] "logical"

它源自:mode(NA)(逻辑)。

作为替代方法,当您将与实验组相关的数据存储在列表中时,您应该尝试使用 "R-ish" 方式来操作此列表。

例如,您可以尝试:

sapply(my.list, FUN=function(element)element$experience$start)
[[1]]
NULL

[[2]]
[1] "Hi"

这突出表明您试图将不兼容的内容集合在一起:简化不能比这个列表更简单——如果您unlist您会忽略这个有意义的NULL