【问题标题】:Converting a List to data frame [problems]将列表转换为数据框 [问题]
【发布时间】:2019-03-14 17:34:29
【问题描述】:

我已将 ped 文件转换为数据框,然后过滤了一些列。

接下来我想知道数据框的唯一值。

我的脚本如下:

 df <- as.data.frame(ped)
 df2 <- df[,-1:-6]
 x <- sapply(df2, unique) 

但是我的向量x 是一个列表类型的对象。 我想用这个脚本把这个列表类型的对象转换成一个数据框

dfinal &lt;- as.data.frame(x)

出现如下错误

错误(函数(...,row.names = NULL,check.rows = FALSE, check.names = TRUE, : 参数暗示不同的行数:3, 2, 1

我认为错误可能是 x 列表中的某些值的数量不同,即

SNP 1.1 : chr [1:3] "T" "C" "0"

SNP 1.2 : chr [1:3] "C" "G" "0"

SNP 1.3 : chr [1:2] "A" "T"

我想要的是一个数据框,其中列名是变量,如"A" "T" "C" "G" "0",行名是Snp1.1, SNP 1.2, ...

我该怎么做?

谢谢

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    我使用mtcars 重现了您的问题。首先我得到了唯一的值,然后将列表的每个部分都变成了一个df,然后将usedrbind堆叠成一个df。最后我把行名变成了一列。

    x <- sapply(mtcars, unique)
    
    x2 <- lapply(x, data.frame)
    
    x3 <- do.call(rbind,x2)
    
    x3$names <- row.names(x3)
    

    【讨论】:

      【解决方案2】:

      您是对的,因此不可能传输不同长度的列表元素;我们将使用 NA 来填补空白

      maxl <- max(sapply(x,length))
      x <- sapply(df, unique) 
      
      library(dplyr)
      library(tidyr)
      lapply(x,function(y)c(y,rep(NA,maxl-length(y)))) %>% 
             bind_rows() %>% 
             gather(key,val) %>% 
             mutate(flag=1) %>% 
             spread(val,flag)
      
      # A tibble: 3 x 7
         key     `0`     A     C     G     T `<NA>`
       <chr> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
      1 SNP1      1    NA     1    NA     1     NA
      2 SNP2      1    NA     1     1    NA     NA
      3 SNP3     NA     1    NA    NA     1      1
      

      使用dput 提供可重现的“假”数据对他人帮助您很重要

      df <- structure(list(SNP1 = c("T", "C", "0"), SNP2 = c("C", "G", "0"
        ), SNP3 = c("A", "T", "T")), class = "data.frame", row.names = c(NA,-3L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-15
        • 1970-01-01
        • 2020-04-17
        相关资源
        最近更新 更多