【问题标题】:Get list to dataframe with uneven row lenghts获取行长不均匀的数据框列表
【发布时间】:2018-11-12 08:46:35
【问题描述】:

有一个由许多行长不均匀的数据帧组成的列表。列名总是在迭代:name、var、name.1、var.1 等。有时有些列只有 1 行和 NA。 Q:如何将它们全部匹配在一起?

 myData<-list(name=c("1","2","3","4","5","6","7"),var=c(5,5,5,5,5,5,5),     name=c(1,2,3,4,5,6,7),var=c(2,2,2,2,2,2),name=c(1,2,3,4,5,6),var=c(5,5,5,4,5),name=c(""),var=c(""))

最终结果如下所示:

  name var name.1 var.1 name.2 var.2 name.3 var.3 …
1  1    5    1      2    1      5    [NA]    [NA] …
2  2    5    2      2    2      5  
3  3
.
.

【问题讨论】:

  • 输入返回错误'错误:意外输入...'
  • 卢克,这两个答案都解决了你的问题吗?如果是这样,请accept an answer 并向我们提供某种形式的“感谢”并结束问题。

标签: r list dataframe subset


【解决方案1】:

固定数据:

myData<-list(name=c("1","2","3","4","5","6","7"),var=c(5,5,5,5,5,5,5),     name=c(1,2,3,4,5,6,7),var=c(2,2,2,2,2,2),name=c(1,2,3,4,5,6),var=c(5,5,5,4,5),name=c(""),var=c(""))

工作解决方案:

( maxlen <- max(lengths(myData)) )
# [1] 7
data.frame(lapply(myData, `length<-`, maxlen))
#   name var name.1 var.1 name.2 var.2 name.3 var.3
# 1    1   5      1     2      1     5             
# 2    2   5      2     2      2     5   <NA>  <NA>
# 3    3   5      3     2      3     5   <NA>  <NA>
# 4    4   5      4     2      4     4   <NA>  <NA>
# 5    5   5      5     2      5     5   <NA>  <NA>
# 6    6   5      6     2      6    NA   <NA>  <NA>
# 7    7   5      7    NA     NA    NA   <NA>  <NA>

【讨论】:

  • 这真是个好方法,谢谢!但我的名单不会接受。如果它是一个大列表 - 16425 obj. 会有什么不同吗?
  • 您的问题不太可重现,因此很难确定。当列表的嵌套发生变化时,它会停止正常工作。 sapply(myData, class) 是否返回 characternumericintegerlogical 以外的任何内容? (即,任何listdata.frame?)
  • 它为每个条目返回一个矩阵。有什么好的转型建议吗?
  • 好的,在这个问题中很高兴知道这一点。尺寸是多少? sapply(myData, dim) 应该给你一个 2 行的 n-column 矩阵,给出所有矩阵的维度(第 1 行是 num-rows,第 2 行是 num-columns,每列是列表中的一个元素)。从sapply(myData,dim) 返回的该矩阵的每一 的最小/最大值是多少?
  • 非常优雅的解决方案,感谢您更正来自 OP 的数据!!
【解决方案2】:

stacking 列出基于tidyverse 的解决方案,然后使用tidyr::spread 传播data.frame

library(tidyverse)

stack(myData) %>% mutate(ind = as.character(ind)) %>%
  group_by(grp = cumsum(ind != lag(ind, default="")) ) %>%
  mutate(ind = paste(ind, (grp+1) %/%2, sep="."), rn = row_number()) %>%
  ungroup() %>% select(-grp) %>%
  spread(ind, values) %>%
  select(-rn) %>% as.data.frame()


#   name.1 name.2 name.3 name.4 var.1 var.2 var.3 var.4
# 1      1      1      1            5     2     5      
# 2      2      2      2   <NA>     5     2     5  <NA>
# 3      3      3      3   <NA>     5     2     5  <NA>
# 4      4      4      4   <NA>     5     2     4  <NA>
# 5      5      5      5   <NA>     5     2     5  <NA>
# 6      6      6      6   <NA>     5     2  <NA>  <NA>
# 7      7      7   <NA>   <NA>     5  <NA>  <NA>  <NA>

数据:更正了来自@r2evans 答案的数据。

myData<-list(name=c("1","2","3","4","5","6","7"),
             var=c(5,5,5,5,5,5,5),
             name=c(1,2,3,4,5,6,7),
             var=c(2,2,2,2,2,2),
             name=c(1,2,3,4,5,6),
             var=c(5,5,5,4,5),name=c(""),var=c(""))

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2019-08-07
    • 2012-09-26
    相关资源
    最近更新 更多