2017-02-15 33 views
0

我有一个问题,我的一些代码,我固定的,但不完全理解为什么错误是错误[R强制转换NA VS串

的代码看起来像:

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 
+0

什么是'df'预期的结果?只有一行的经验开始id2“嗨”或两行? –

+0

更新了结果 - df1是错误的,我想知道为什么 – Olivia

回答

1

奥利维亚,感谢澄清。 你快到了。循环时,确实第一次迭代将确定输出数据的列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

+0

NULL或NA是必需的,因此行数是正确的。这就是为什么有一个基于i的id列。我的实际数据更复杂,从嵌套列表中提取,这些列表来自api的json响应。使用“0”似乎工作。我没有检查,看看如果0也可以工作,或者数字是否会混淆后面的字符 – Olivia