【问题标题】:Combining lists with do.call while preserving each entry of the list on a row将列表与 do.call 组合,同时将列表的每个条目保留在一行中
【发布时间】:2017-09-24 09:30:27
【问题描述】:

如果之前有人问过这个问题,请原谅我......

我有多个列表希望组合如下

A <- list(c("R", "L", "*", "T", "M", "S", "S", "S", "S", "Y"), 
  c("G", "A", "G", "P", "P", "V", "P"), 
  c("E", "G", "R", "E", "Q", "T", "K", "G", "S", "G"), 
  c("Y", "N", "N", "D", "W"), 
  c("T", "K"))

B <- list(c("G", "T", "Q", "R"), 
  c("T", "G", "L", "W", "D", "Y", "*", "L", "Q", "H", "A", "P", "H", "L", "H", "L"), 
  c("E", "E", "D", "A", "G", "G", "R", "E", "D", "S", "I", "L", "V", "N", "G", "A", "T", "P", "\"", "\"", "C", "S", "D", "Q", "S", "S", "D", "S", "P", "P", "I", "L", "E", "A", "I", "R"), 
  c("S", "M", "C", "G", "*", "I", "K", "P"), 
  c("D", "S", "P"))

C <- list(c("G", "L", "V", "L", "A", "H", "L", "R", "R", "L", "G"), 
  c("G", "S", "D", "T", "P", "V", "M", "P", "K", "L", "F"), 
  c("N", "W", "F", "E", "N", "T", "F", "D", "F", "R", "N", "K", "R", "C", "K", "*", "V"), 
  c("P", "A", "T", "R", "S", "L", "R", "R", "R", "A", "T", "A"), 
  c("I", "G", "F", "I", "P", "S", "P", "L", "R"))

我想要的是这个:

A           B                                       C
RL*TMSSSSY  GTQR                                    GLVLAHLRRLG
GAGPPVP     TGLWDY*LQHAPHLHL                        GSDTPVMPKLF 
EGREQTKGSG  EEDAGGREDSILVNGATP""CSDQSSDSPPILEAIR    NWFENTFDFRNKRCK*V
YNNDW       SMCG*IKP                                PATRSLRRRATA
TK          DSP                                     IGFIPSPLR

我尝试了以下方法,但这会将列表的每个字符放在不同的行上,这相当于每个列表的不同行数:

do.call(cbind, list(A,B,C))

有没有办法得到我想要的?

谢谢

【问题讨论】:

    标签: r list cbind do.call


    【解决方案1】:

    这是一种基本的 R 方法。

    data.frame(do.call(mapply,
                       list(function(x) sapply(x, paste, collapse=""), list(A=A, B=B, C=C))))
    

    返回

               A                                    B                 C
    1 RL*TMSSSSY                                 GTQR       GLVLAHLRRLG
    2    GAGPPVP                     TGLWDY*LQHAPHLHL       GSDTPVMPKLF
    3 EGREQTKGSG EEDAGGREDSILVNGATP""CSDQSSDSPPILEAIR NWFENTFDFRNKRCK*V
    4      YNNDW                             SMCG*IKP      PATRSLRRRATA
    5         TK                                  DSP         IGFIPSPLR
    

    在这里,do.call 适用于Map。第二行中的列表是 Map 的参数,它将sapply 应用于列表的命名列表。 sapply 粘贴每个列表项的向量并返回一个向量。

    注意事项:

    1. 这是一种尝试复制 alexis-laz 之前向我展示的方法 here
    2. 我最初使用Map,但根据microbenchmarkmapply 似乎快了大约 33%(344 毫秒对 513 毫秒)。

    【讨论】:

      【解决方案2】:

      如果你想使用tidyverse 函数,你可以这样做

      library(tidyverse)
      lst(A,B,C) %>% map_df(map_chr, paste, collapse="")
      

      lst() 函数允许使用创建列表并保留变量名称。然后我们map() 覆盖列,在每一列中,map() 覆盖字符向量列表并折叠它们。

      【讨论】:

      • 不错的方法。我之前尝试过使用嵌套地图,但不知何故无法正常工作。
      【解决方案3】:

      我们可以使用嵌套的sapply 来循环list

       m1 <- sapply(list(A, B, C), function(x) sapply(x, paste, collapse=""))
       setNames(as.data.frame(m1), LETTERS[1:3])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        • 2023-01-08
        • 2021-06-05
        • 1970-01-01
        • 2021-10-17
        • 1970-01-01
        相关资源
        最近更新 更多