【问题标题】:How can I aggregate elements of list of lists to get one vector? [duplicate]如何聚合列表列表的元素以获得一个向量? [复制]
【发布时间】:2020-03-12 16:18:35
【问题描述】:

我有列表列表(长度相同:n)。如何连接它们以获得相同输入长度 (n) 的一个向量?例如我有:

[[1]] 
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[[2]] 
[1] "a" "a" NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[[3]]
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA "d" "e" NA NA NA

我想得到:

"a" "a" NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA "d" "e" NA NA NA

我试过了:

Reduce('union',lapply(l,function(x){x$AB}))

但我得到了:

"a" NA "d" "e"

我想得到一个与输入l[[1]]$AB 长度相同的向量。有什么想法吗?

【问题讨论】:

  • 您能否与dput(x$AB) 共享您的输入数据(如果x$AB 是您的数据对象的名称)?这将有助于澄清您的对象是否真的是一个嵌套列表。

标签: r list dataframe


【解决方案1】:

我相信你正在寻找dplyrcoalesce

library(dplyr)
mylist<-lapply(mylist,as,"character")
do.call(coalesce,mylist)
[1] "a" "a" NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  "d" "e" NA  NA  NA 

注意:使用您的确切示例,列表中的第一个元素会自动解释为逻辑类,因为它都是NAs。我在上面的代码中添加了第 2 行,通过将列表中的所有行强制转换为 character 类来解决这个问题。

【讨论】:

    【解决方案2】:

    我们可以使用pmax

    do.call(pmax, c(l, na.rm = TRUE))
    #[1] "a" "a" NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  "d" "e" NA  NA  NA 
    

    数据

    l <- list(c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA), c("a", "a", NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA), c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, "d", "e", NA, NA, NA))
    

    【讨论】:

    • 您的解决方案do.call(pmax, c(list_obj, na.rm = TRUE)) 发布here 有效。我作为重复关闭。
    • 我已经对链接中的那个投了赞成票,相信这是正确的地方。但我可以重新打开/投票/关闭:(。
    • 这是一个骗子,但问题不是很清楚,尤其是x$AB
    【解决方案3】:

    您还可以通过转换为 data.frame 来执行行操作:

    list_obj <- list(rep(NA, 20), c("a", "a", rep(NA, 18)), c(rep(NA,16), "d", "e", NA, NA))
    df_l <- as.data.frame(list_obj)
    apply(df_l, 1, FUN = function(x) paste(ifelse(is.na(x), "", x), collapse = ""))
    #>  [1] "a" "a" ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  "d" "e" "" 
    #> [20] ""
    

    【讨论】:

      【解决方案4】:

      您可以将列表强制转换为数据框并像这样使用ifelse 案例处理:

      apply(as.data.frame(l), 1, function(x) ifelse(all(is.na(x)), NA, x[!is.na(x)]))
      # [1] "a" "a" NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
      # [17] NA  NA  "d" "e" NA  NA  NA 
      

      数据

      l <- list(c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
      NA, NA, NA, NA, NA, NA, NA, NA, NA), c("a", "a", NA, NA, NA, 
      NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
      NA, NA), c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
      NA, NA, NA, NA, NA, "d", "e", NA, NA, NA))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-11
        • 1970-01-01
        • 2021-06-16
        相关资源
        最近更新 更多