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
我的一些代码有问题,我修复了它,但不完全理解错误的原因
代码如下:
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