【问题标题】:R: How to colapse a list of list (from str_split) into just one list and preserve some row data?R:如何将列表列表(来自 strsplit)折叠成一个列表并保留一些行数据?
【发布时间】:2016-01-05 17:16:06
【问题描述】:

str_split 的输出生成一个列表。列表列表如何折叠成扁平列表?

请参阅下面的示例数据:

library(magrittr)   
library(dplyr)


url='https://github.com/macarthur-lab/clinvar/raw/master/output/clinvar.tsv.gz'
w=readr::read_tsv(url) #warnings can be safely ignored
w<-w %>% filter(grepl('LabCorp',all_submitters))
#traits are separated by semicolons
ttd<-stringr::str_split(w$all_traits,pattern = ';')
#there are several traits per row from str_split
ttd.l<-sapply(ttd,length)
#sample
ttd[[77]]
[1] "Hereditary cancer-predisposing syndrome"
[2] "Lynch syndrome"                         
[3] "Lynch Syndrome"                         
[4] "Neoplastic Syndromes, Hereditary"       
[5] "Hereditary non-polyposis colon cancer"  
#how to put all 'all-traits' into single vector

这似乎不行:

traits<-lapply(ttd,c)
table(traits)

编辑:简单 unlist(ttd) 的问题是我需要在 w$measureset_id 中保留行的 ID

像这样:

out=data.frame()
for (i in 1:length(ttd)) {
  print(i)
  #unlist(ttd[[i]])
  one<-data.frame(id=w[i,'measureset_id']
                   ,trait=unique(toupper(unlist(ttd[[i]]))))
  out<-rbind(out,one)
}

头(出,5)

  measureset_id                          trait
1         36663             CARDIAC ARRHYTHMIA
2         36663                     ARRHYTHMIA
3         12779 PHEOCHROMOCYTOMA/PARAGANGLIOMA
4         12779               PHEOCHROMOCYTOMA
5         12779               PARAGANGLIOMAS 4

【问题讨论】:

  • unlist 做你想做的事吗?
  • unlist() 会做你需要的吗?
  • unlist() 是你想要的吗? (冷嘲热讽)。或者实际上,你可以做ttd &lt;- scan(text = w$all_traits, sep = ";", what = ""),而不是拆分
  • OP:可重现的示例很有用,但将来尝试指定您正在使用的包(readr 和 dplyr)。其他:添加评论时,它确实建议您不要使用评论来回答问题。
  • 好的,鉴于 OP 想要的其他信息,我正在添加新的答案。

标签: r dplyr plyr stringr


【解决方案1】:

您的 ttd 是字符向量列表。如果您想要的是所有元素长度为 3992 的字符向量,那么您只需要

traits <- unlist(ttd)

【讨论】:

    【解决方案2】:

    根据您想要的附加信息,这里有几种方法可以做到这一点。在您创建 ttd 之前,我会立即在您的代码中插入这一点,因为这只会让您自己的生活变得艰难。

    library(plyr)
    library(dplyr)
    
    #First, create a useful function
    getTraits <- function(x) data_frame(trait=unique(unlist(strsplit(x$all_traits, split=";"))))
    
    #Method 1 using plyr
    traits <- ddply(w, .(measureset_id), getTraits)
    head(traits)
    #  measureset_id                                        trait
    #1           788                 Sudden infant death syndrome
    #2           788                           Brugada syndrome 2
    #3           788 Primary familial hypertrophic cardiomyopathy
    #4           788                 Sudden Infant Death Syndrome
    #5           788                               Cardiomyopathy
    #6           788                             Long QT syndrome
    traits[traits$measureset_id == 36663, ]
    #     measureset_id              trait
    #3231         36663 Cardiac arrhythmia
    #3232         36663         Arrhythmia
    
    #Method 2 using dplyr
    traitsd <- w %>% group_by(measureset_id) %>% do(getTraits(.))
    head(traitsd)
    #Source: local data frame [6 x 2]
    #Groups: measureset_id [1]
    #
    #  measureset_id                                        trait
    #          (int)                                        (chr)
    #1           788                 Sudden infant death syndrome
    #2           788                           Brugada syndrome 2
    #3           788 Primary familial hypertrophic cardiomyopathy
    #4           788                 Sudden Infant Death Syndrome
    #5           788                               Cardiomyopathy
    #6           788                             Long QT syndrome
    traitsd[traitsd$measureset_id == 36663, ]
    #Source: local data frame [2 x 2]
    #Groups: measureset_id [1]
    #
    #  measureset_id              trait
    #          (int)              (chr)
    #1         36663 Cardiac arrhythmia
    #2         36663         Arrhythmia
    

    【讨论】:

    • 谢谢。有两种方法是一个很好的答案。我尝试使用 dplyr 很多,所以我非常喜欢你的方法 2。每个 measureset_id 总是只有一行。但是 group_by 是用来告诉 dplyr 要做什么的(我猜)。
    猜你喜欢
    • 2021-08-20
    • 2021-04-11
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多