Преобразование списка в фрейм данных [проблемы] - PullRequest
0 голосов
/ 14 марта 2019

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

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

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

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

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

dfinal <- as.data.frame(x)

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

Ошибка в (function (..., 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 голосов
/ 14 марта 2019

Вы правы, поэтому перенос списка элементов разной длины невозможен;мы восполним этот пробел, используя 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))
0 голосов
/ 14 марта 2019

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

x <- sapply(mtcars, unique)

x2 <- lapply(x, data.frame)

x3 <- do.call(rbind,x2)

x3$names <- row.names(x3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...