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