将列表转换为数据框[问题]

时间:2019-03-14 17:34:29

标签: r list dataframe

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

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

我的脚本如下:

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

但是我的向量x是一个列表类型对象。 我想使用此脚本将此列表类型对象转换为数据框

dfinal <- 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, ...

我该怎么做?

谢谢

2 个答案:

答案 0 :(得分:0)

我使用mtcars重现了您的问题。首先,我获得了唯一值,然后将列表的每个部分转换为df,然后堆叠使用rbind将其转换为一个df。最后,我将行名称转换为列。

x <- sapply(mtcars, unique)

x2 <- lapply(x, data.frame)

x3 <- do.call(rbind,x2)

x3$names <- row.names(x3)

答案 1 :(得分:0)

您是正确的,因此无法传输不同长度的列表元素。我们将使用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))