Преобразование списка во фрейм данных [проблемы]

#r #list #dataframe

#r #Список #фрейм данных

Вопрос:

Я преобразовал файл ped во фрейм данных, затем я фильтрую некоторые столбцы.

Далее я хотел узнать уникальные значения фрейма данных.

Мой сценарий выглядит следующим образом:

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

Но мой вектор x представляет собой объект типа списка.
Я хотел преобразовать этот объект типа списка во фрейм данных с помощью этого скрипта

dfinal <- as.data.frame(x)

Появляется следующая ошибка

Ошибка в (function (…, row.names = NULL, проверьте.строки = 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, ...

Как я могу это сделать?

Спасибо

Ответ №1:

Я использовал mtcars , чтобы воспроизвести вашу проблему. Сначала я получил уникальные значения, затем превратил каждую часть списка в df, затем сложил использованные rbind , чтобы свести их в один df. Наконец-то я превратил имена строк в столбец.

 x <- sapply(mtcars, unique)

x2 <- lapply(x, data.frame)

x3 <- do.call(rbind,x2)

x3$names <- row.names(x3)
  

Ответ №2:

Вы правы, поэтому перенос элементов списка разной длины невозможен; мы восполним этот пробел с помощью NAs

 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))