【问题标题】:Convert a list in data.frame in format Longdata [duplicate]以Longdata格式转换data.frame中的列表[重复]
【发布时间】:2018-03-02 13:29:59
【问题描述】:

我在 R 的类列表中有这个数据库。

$multiinstrumentais
[1] "248269" "248827"

$geds
[1] "248198" "248198" "248857"

$ghzmb
[1] "248087" "296994" "302862"

我想在 data.frame 中转换成这样的东西:

words - cod 
multiinstrumentais - 248269
multiinstrumentais - 248827
geds - 248198
geds - 248198
geds - 248857
ghzmb - 248087
ghzmb - 296994
ghzmb - 302862

【问题讨论】:

  • 到目前为止你尝试过什么?您在哪一步遇到问题?

标签: r list dataframe


【解决方案1】:

也许有更优雅的方式,但这会很好:

lst<- list(
  multiinstrumentais=c("248269","248827"),
  geds=c("248198","248198","248857"),
  ghzmb=c("248087","296994","302862")
)


df <- do.call(rbind,
lapply(seq_along(lst), function(ix) data.frame(words=rep(names(lst)[ix],length(lst[[ix]])),
                                              cod=lst[[ix]]))
)

#output

# > df
# words    cod
# 1 multiinstrumentais 248269
# 2 multiinstrumentais 248827
# 3               geds 248198
# 4               geds 248198
# 5               geds 248857
# 6              ghzmb 248087
# 7              ghzmb 296994
# 8              ghzmb 302862

这使用lapply 迭代列表元素,将元素名称的倍数和数据框中的相应值绑定在一起。

do.call(rbind, 将所有内容组合到一个数据帧中。

【讨论】:

    【解决方案2】:

    这实际上可以通过 base R 中的stack 来完成:

    stack(lst)
    
      values                ind
    1 248269 multiinstrumentais
    2 248827 multiinstrumentais
    3 248198               geds
    4 248198               geds
    5 248857               geds
    6 248087              ghzmb
    7 296994              ghzmb
    8 302862              ghzmb
    

    这是另一个使用dplyrtibble 的解决方案,虽然这会在行名称的末尾添加一个数字,但您可以通过将mutate(rowname = str_remove(rowname, pattern = '[[:digit:]]+')) 添加到链中来删除它:

    library(tibble)
    library(dplyr)
    
    lst %>% 
      unlist() %>% 
      as.tibble() %>%
      rownames_to_column()
    

    返回:

    # A tibble: 8 x 2
      rowname             value 
      <chr>               <chr> 
    1 multiinstrumentais1 248269
    2 multiinstrumentais2 248827
    3 geds1               248198
    4 geds2               248198
    5 geds3               248857
    6 ghzmb1              248087
    7 ghzmb2              296994
    8 ghzmb3              302862
    

    或者使用tidyrdplyr,这似乎有效:

    lst %>% 
      unlist() %>% 
      bind_rows() %>% 
      gather()
    
    # Alternatively, this one liner
    tidyr::gather(bind_rows(unlist(lst)))
    

    使用 Val 的数据:

    lst<- list(
      multiinstrumentais=c("248269","248827"),
      geds=c("248198","248198","248857"),
      ghzmb=c("248087","296994","302862")
    )
    

    【讨论】:

    • 单线甜!不过,您应该为tidyr 添加library 调用。
    • 好主意,我加了:)
    • 如何去掉末尾的数字?
    • 试试stack(lst)
    • 创建后如何去掉最后的数字????行名值 1 multiinstrumentais1 248269 2 multiinstrumentais2 248827 3 geds1 248198 4 geds2 248198 5 geds3 248857 6 ghzmb1 248087 7 ghzmb2 296994 8 ghzmb3 302862
    猜你喜欢
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2022-01-02
    • 1970-01-01
    • 2019-09-09
    • 2015-01-06
    相关资源
    最近更新 更多