将字符向量列表的混合数据帧转换为统一数据帧
mixed dataframe of list of character vectors into uniform dataframe
我正在尝试使用 stringr 包将字符串分解为列。
> df <- dput(head(facs,3))
structure(list(geo_accession = structure(1:3, .Names = c("V2",
"V3", "V4"), .Label = c("GSM1494875", "GSM1494877", "GSM1494879",
"GSM1494881", "GSM1494883", "GSM1494885", "GSM1494887", "GSM1494889",
"GSM1494891", "GSM1494893", "GSM1494895", "GSM1494897", "GSM1494899",
"GSM1494901", "GSM1494903", "GSM1494906", "GSM1494908", "GSM1494910",
"GSM1494912", "GSM1494914", "GSM1494917", "GSM1494919", "GSM1494921",
"GSM1494923"), class = "factor"), title = structure(1:3, .Names = c("V2",
"V3", "V4"), .Label = c("2818 - Akt treated TIL - repeat 1 - mAdbID:125971",
"2818 - Akt treated TIL - repeat 2 - mAdbID:125972", "2818 - Akt treated TIL - repeat 3 - mAdbID:125973",
"2818 - Akt treated TIL - repeat 4 - mAdbID:125974", "2818 - Untreated TIL - repeat 1 - mAdbID:125975",
"2818 - Untreated TIL - repeat 2 - mAdbID:125976", "2818 - Untreated TIL - repeat 3 - mAdbID:125977",
"2818 - Untreated TIL - repeat 4 - mAdbID:125978", "3289 - Akt treated TIL - repeat 1 - mAdbID:125979",
"3289 - Akt treated TIL - repeat 2 - mAdbID:125980", "3289 - Akt treated TIL - repeat 3 - mAdbID:125981",
"3289 - Akt treated TIL - repeat 4 - mAdbID:125982", "3289 - Untreated TIL - repeat 1 - mAdbID:125983",
"3289 - Untreated TIL - repeat 2 - mAdbID:125984", "3289 - Untreated TIL - repeat 3 - mAdbID:125985",
"3289 - Untreated TIL - repeat 4 - mAdbID:125986", "3784 - Akt treated TIL - repeat 1 - mAdbID:125987",
"3784 - Akt treated TIL - repeat 2 - mAdbID:125988", "3784 - Akt treated TIL - repeat 3 - mAdbID:125989",
"3784 - Akt treated TIL - repeat 4 - mAdbID:125990", "3784 - Untreated TIL - repeat 1 - mAdbID:125991",
"3784 - Untreated TIL - repeat 2 - mAdbID:125992", "3784 - Untreated TIL - repeat 3 - mAdbID:125993",
"3784 - Untreated TIL - repeat 4 - mAdbID:125994"), class = "factor")), .Names = c("geo_accession",
"title"), row.names = c("GSM1494875", "GSM1494877", "GSM1494879"
), class = "data.frame")
现在它是一个 2 列数据框。
> sapply(df, class)
geo_accession title
"factor" "factor"
如果我使用 str_split_fixed
,
> df$title = str_split_fixed(df[,"title"], " - ", 4)
> df
geo_accession title.1 title.2 title.3 title.4
GSM1494875 GSM1494875 2818 Akt treated TIL repeat 1 mAdbID:125971
GSM1494877 GSM1494877 2818 Akt treated TIL repeat 2 mAdbID:125972
> sapply(df, class)
geo_accession title
"factor" "matrix"
我想看到的是 5 列数据框,而不是 2 列混合数据框(因子、矩阵)。
> df
geo_accession title1 title2 title3 title4
GSM1494875 GSM1494875 2818 Akt treated TIL repeat 1 mAdbID:125971
GSM1494877 GSM1494877 2818 Akt treated TIL repeat 2 mAdbID:125972
> sapply(df, class)
geo_accession title.1 title.2 title.3 title.4
"factor" "factor" "factor" "factor" "factor"
我不知道如何清理混合数据框。如何将其转换为 5 列数据框?
str_split_fixed
的输出是 vectors
的 list
。将 list
分配给单个列是问题的原因。一种方法是将它分配给多个列,否则,我们可以用 do.call(data.frame
修复它,即
facs1 <- do.call(data.frame, facs)
或者我们可以使用 base R
方法与 read.csv/read.table
删除 -
前后的空格,然后 cbind
与第一列
facs2 <- cbind(facs[1], read.csv(text=gsub("\s+-\s+", "-", facs$title),
sep="-", header=FALSE, col.names = paste0("title.", 1:4), stringsAsFactors=FALSE))
facs2
# geo_accession title.1 title.2 title.3 title.4
#GSM1494875 GSM1494875 2818 Akt treated TIL repeat 1 mAdbID:125971
#GSM1494877 GSM1494877 2818 Akt treated TIL repeat 2 mAdbID:125972
str(facs2)
#'data.frame': 2 obs. of 5 variables:
#$ geo_accession: chr "GSM1494875" "GSM1494877"
#$ title.1 : int 2818 2818
#$ title.2 : chr "Akt treated TIL" "Akt treated TIL"
#$ title.3 : chr "repeat 1" "repeat 2"
#$ title.4 : chr "mAdbID:125971" "mAdbID:125972"
或者一个紧凑的选项是 cSplit
来自 splitstackshape
library(splitstackshape)
cSplit(facs, "title", " - ")
您可以使用 tidyr
包中的 separate
:
library(tidyr)
df %>% separate(title, paste0('title',1:4) ,' - ')
geo_accession title1 title2 title3 title4
1 GSM1494875 GSM1494875 2818 Akt treated TIL repeat 1 mAdbID:125971
2 GSM1494877 GSM1494877 2818 Akt treated TIL repeat 2 mAdbID:125972
我正在尝试使用 stringr 包将字符串分解为列。
> df <- dput(head(facs,3))
structure(list(geo_accession = structure(1:3, .Names = c("V2",
"V3", "V4"), .Label = c("GSM1494875", "GSM1494877", "GSM1494879",
"GSM1494881", "GSM1494883", "GSM1494885", "GSM1494887", "GSM1494889",
"GSM1494891", "GSM1494893", "GSM1494895", "GSM1494897", "GSM1494899",
"GSM1494901", "GSM1494903", "GSM1494906", "GSM1494908", "GSM1494910",
"GSM1494912", "GSM1494914", "GSM1494917", "GSM1494919", "GSM1494921",
"GSM1494923"), class = "factor"), title = structure(1:3, .Names = c("V2",
"V3", "V4"), .Label = c("2818 - Akt treated TIL - repeat 1 - mAdbID:125971",
"2818 - Akt treated TIL - repeat 2 - mAdbID:125972", "2818 - Akt treated TIL - repeat 3 - mAdbID:125973",
"2818 - Akt treated TIL - repeat 4 - mAdbID:125974", "2818 - Untreated TIL - repeat 1 - mAdbID:125975",
"2818 - Untreated TIL - repeat 2 - mAdbID:125976", "2818 - Untreated TIL - repeat 3 - mAdbID:125977",
"2818 - Untreated TIL - repeat 4 - mAdbID:125978", "3289 - Akt treated TIL - repeat 1 - mAdbID:125979",
"3289 - Akt treated TIL - repeat 2 - mAdbID:125980", "3289 - Akt treated TIL - repeat 3 - mAdbID:125981",
"3289 - Akt treated TIL - repeat 4 - mAdbID:125982", "3289 - Untreated TIL - repeat 1 - mAdbID:125983",
"3289 - Untreated TIL - repeat 2 - mAdbID:125984", "3289 - Untreated TIL - repeat 3 - mAdbID:125985",
"3289 - Untreated TIL - repeat 4 - mAdbID:125986", "3784 - Akt treated TIL - repeat 1 - mAdbID:125987",
"3784 - Akt treated TIL - repeat 2 - mAdbID:125988", "3784 - Akt treated TIL - repeat 3 - mAdbID:125989",
"3784 - Akt treated TIL - repeat 4 - mAdbID:125990", "3784 - Untreated TIL - repeat 1 - mAdbID:125991",
"3784 - Untreated TIL - repeat 2 - mAdbID:125992", "3784 - Untreated TIL - repeat 3 - mAdbID:125993",
"3784 - Untreated TIL - repeat 4 - mAdbID:125994"), class = "factor")), .Names = c("geo_accession",
"title"), row.names = c("GSM1494875", "GSM1494877", "GSM1494879"
), class = "data.frame")
现在它是一个 2 列数据框。
> sapply(df, class)
geo_accession title
"factor" "factor"
如果我使用 str_split_fixed
,
> df$title = str_split_fixed(df[,"title"], " - ", 4)
> df
geo_accession title.1 title.2 title.3 title.4
GSM1494875 GSM1494875 2818 Akt treated TIL repeat 1 mAdbID:125971
GSM1494877 GSM1494877 2818 Akt treated TIL repeat 2 mAdbID:125972
> sapply(df, class)
geo_accession title
"factor" "matrix"
我想看到的是 5 列数据框,而不是 2 列混合数据框(因子、矩阵)。
> df
geo_accession title1 title2 title3 title4
GSM1494875 GSM1494875 2818 Akt treated TIL repeat 1 mAdbID:125971
GSM1494877 GSM1494877 2818 Akt treated TIL repeat 2 mAdbID:125972
> sapply(df, class)
geo_accession title.1 title.2 title.3 title.4
"factor" "factor" "factor" "factor" "factor"
我不知道如何清理混合数据框。如何将其转换为 5 列数据框?
str_split_fixed
的输出是 vectors
的 list
。将 list
分配给单个列是问题的原因。一种方法是将它分配给多个列,否则,我们可以用 do.call(data.frame
修复它,即
facs1 <- do.call(data.frame, facs)
或者我们可以使用 base R
方法与 read.csv/read.table
删除 -
前后的空格,然后 cbind
与第一列
facs2 <- cbind(facs[1], read.csv(text=gsub("\s+-\s+", "-", facs$title),
sep="-", header=FALSE, col.names = paste0("title.", 1:4), stringsAsFactors=FALSE))
facs2
# geo_accession title.1 title.2 title.3 title.4
#GSM1494875 GSM1494875 2818 Akt treated TIL repeat 1 mAdbID:125971
#GSM1494877 GSM1494877 2818 Akt treated TIL repeat 2 mAdbID:125972
str(facs2)
#'data.frame': 2 obs. of 5 variables:
#$ geo_accession: chr "GSM1494875" "GSM1494877"
#$ title.1 : int 2818 2818
#$ title.2 : chr "Akt treated TIL" "Akt treated TIL"
#$ title.3 : chr "repeat 1" "repeat 2"
#$ title.4 : chr "mAdbID:125971" "mAdbID:125972"
或者一个紧凑的选项是 cSplit
来自 splitstackshape
library(splitstackshape)
cSplit(facs, "title", " - ")
您可以使用 tidyr
包中的 separate
:
library(tidyr)
df %>% separate(title, paste0('title',1:4) ,' - ')
geo_accession title1 title2 title3 title4
1 GSM1494875 GSM1494875 2818 Akt treated TIL repeat 1 mAdbID:125971
2 GSM1494877 GSM1494877 2818 Akt treated TIL repeat 2 mAdbID:125972