各行に可変数のフィールドを持つ大きなテキストファイルがあります。各行の最初のエントリは生物学的経路に対応し、後続の各エントリはその経路の遺伝子に対応します。最初の数行は次のようになります
path1 gene1 gene2
path2 gene3 gene4 gene5 gene6
path3 gene7 gene8 gene9
このファイルをリストとしてRに読み込む必要があります。各要素は文字ベクトルで、リスト内の各要素の名前は行の最初の要素です。次に例を示します。
> pathways <- list(
+ path1=c("gene1","gene2"),
+ path2=c("gene3","gene4","gene5","gene6"),
+ path3=c("gene7","gene8","gene9")
+ )
>
> str(pathways)
List of 3
$ path1: chr [1:2] "gene1" "gene2"
$ path2: chr [1:4] "gene3" "gene4" "gene5" "gene6"
$ path3: chr [1:3] "gene7" "gene8" "gene9"
>
> str(pathways$path1)
chr [1:2] "gene1" "gene2"
>
> print(pathways)
$path1
[1] "gene1" "gene2"
$path2
[1] "gene3" "gene4" "gene5" "gene6"
$path3
[1] "gene7" "gene8" "gene9"
...しかし、これを何千行も自動的に行う必要があります。 以前にここに投稿された同様の質問 を見ましたが、そのスレッドからこれを行う方法がわかりませんでした。
前もって感謝します。
これを行う1つの方法を次に示します。
# Read in the data
x <- scan("data.txt", what="", sep="\n")
# Separate elements by one or more whitepace
y <- strsplit(x, "[[:space:]]+")
# Extract the first vector element and set it as the list element name
names(y) <- sapply(y, `[[`, 1)
#names(y) <- sapply(y, function(x) x[[1]]) # same as above
# Remove the first vector element from each list element
y <- lapply(y, `[`, -1)
#y <- lapply(y, function(x) x[-1]) # same as above
1つの解決策は、read.table()
を介してデータを読み込むことですが、fill = TRUE
引数を使用して、より少ない「エントリ」で行を埋め込み、結果のデータフレームをリストに変換してから、「空の」要素をクリーンアップします。
まず、以下のデータのスニペットを読み取ります。
con <- textConnection("path1 gene1 gene2
path2 gene3 gene4 gene5 gene6
path3 gene7 gene8 gene9
")
dat <- read.table(con, fill = TRUE, stringsAsFactors = FALSE)
close(con)
次に、最初の列を削除し、後でリストの名前用に保存します
nams <- dat[, 1]
dat <- dat[, -1]
データフレームをリストに変換します。ここでは、インデックス1、2、...、nでデータフレームを分割します。nは行数です。
ldat <- split(dat, seq_len(nrow(dat)))
空のセルをクリーンアップします。
ldat <- lapply(ldat, function(x) x[x != ""])
最後に、名前を適用します
names(ldat) <- nams
与える:
> ldat
$path1
[1] "gene1" "gene2"
$path2
[1] "gene3" "gene4" "gene5" "gene6"
$path3
[1] "gene7" "gene8" "gene9"
もう1つのソリューション:
sl <- c("path1 gene1 gene2", "path2 gene1 gene2 gene3") # created by readLines
f <- function(l, s) {
v <- strsplit(s, " ")[[1]]
l[[v[1]]] <- v[2:length(v)]
return(l)
}
res <- Reduce(f, sl, list())
リンクされたページに基づいた迅速なソリューション...
inlist <- strsplit(readLines("file.txt"), "[[:space:]]+")
pathways <- lapply(inlist, tail, n = -1)
names(pathways) <- lapply(inlist, head, n = 1)