我已将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, ...
我该怎么做?
谢谢
答案 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))