我有一个嵌套列表,看起来像这样:
characlist<-list(list(c(1,2,3,4)),c(1,3,2,NA))
接下来,我想用NA替换所有等于1的值。我尝试了以下操作,但它产生了一个错误:
lapply(characlist,function(x) ifelse(x==1,NA,x))
Error in ifelse(x == 1, NA, x) :
(list) object cannot be coerced to type 'double'
有人能告诉我代码有什么问题吗?
答案 0 :(得分:10)
改为使用rapply
:
> rapply(characlist,function(x) ifelse(x==1,NA,x), how = "replace")
#[[1]]
#[[1]][[1]]
#[1] NA 2 3 4
#
#
#[[2]]
#[1] NA 3 2 NA
您最初的方法中的问题是您的第一个列表元素本身就是一个列表。因此,您不能像在原子矢量上那样直接应用ifelse
逻辑。使用?rapply
可以避免此问题(rapply
是lapply
的递归版本。)
答案 1 :(得分:3)
另一个选项是在我们replace
unlist
ed向量中1到NA的元素之后使用skeleton
。我们将list
指定为原始 v1 <- unlist(characlist)
relist(replace(v1, v1==1, NA), skeleton=characlist)
#[[1]]
#[[1]][[1]]
#[1] NA 2 3 4
#[[2]]
#[1] NA 3 2 NA
以获得相同的结构。
{{1}}