【问题标题】:Replacing NAs from onle list by NAs in second list in equal positions in R用 R 中相同位置的第二个列表中的 NA 替换唯一列表中的 NA
【发布时间】:2016-01-01 21:13:06
【问题描述】:

这就是问题所在。我有两个向量列表。这些向量在相同位置具有相同的长度。但是这些向量中有一些 NA。数据可能看起来像

HH
[[1]]
[1]  2  1  5 NA

[[2]]
[1] 2 0 5

[[3]]
[1] NA  1 NA

JJ
[[1]]
[1] 0 5 8 9

[[2]]
[1] NA  1  3

[[3]]
[1] 2 8 3

我的目标是:在所有向量的两个列表中都有 NA 在相同的位置。更准确地说,编写代码,它将在第一个列表中找到 NA,并在第二个列表中的相等位置用 NA 替换值。我成功地为向量编写了类似的函数,但我在这里失败了。你能帮助我吗?这是我的代码。

D<-NULL
for(j in 1:length(PH)){
+ for(i in 1:length(PH[[j]])){
+ if(is.na(PH[[j]][i])==FALSE){
+ D[[j]][i]=AB[[j]][i]}
+ else{
+ D[[j]][i]=NA}}
+ }

【问题讨论】:

    标签: r list


    【解决方案1】:

    你可以使用Map:

    Map(function(u,v) {v[is.na(u)]<-NA;v}, firstlist, secondlist)
    

    示例:

    firstlist  = list(c(1,2,3,NA), c('a',NA))
    secondlist = list(c(NA,22,33,5), c('b','d'))
    
    #[[1]]
    #[1] NA 22 33 NA
    
    #[[2]]
    #[1] "b" NA 
    

    【讨论】:

    • 我真的不建议为此使用双循环,这显然不是关于如何使用R的“心态”!
    【解决方案2】:

    这是我的两分钱。从@Colonel 的回答中获取数据,

    v1 <- unlist(firstlist)
    v2 <- unlist(secondlist)
    v1[is.na(v2)] <- NA
    relist(v1, firstlist)
    
    #[[1]]
    #[1] NA  "2" "3" NA 
    
    #[[2]]
    #[1] "a" NA 
    

    【讨论】:

    • 很好的解决方案!我不知道relist()。这确实大大简化了问题,能够处理向量,然后将其重组为列表。谢谢!
    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 2018-08-25
    • 2015-07-28
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    相关资源
    最近更新 更多