R typecast NA vs string

时间:2017-02-15 10:42:20

标签: r casting na

我的一些代码出了问题并修复了它,但没有完全理解为什么错误是错误

代码看起来像:

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是第一个结果,那么每个结果都是在“格式”中,其中某些内容是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

结果:

<input type="date">

1 个答案:

答案 0 :(得分:1)

奥利维亚,谢谢你的澄清。 你快到了。在循环时,第一次迭代确实会确定输出data.frame data的列df的类。

在方案1中,您可以通过逐步完成循环来获得更好的想法:

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

然后,看看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