web-dev-qa-db-ja.com

Rにリストするテキストファイル

各行に可変数のフィールドを持つ大きなテキストファイルがあります。各行の最初のエントリは生物学的経路に対応し、後続の各エントリはその経路の遺伝子に対応します。最初の数行は次のようになります

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"

...しかし、これを何千行も自動的に行う必要があります。 以前にここに投稿された同様の質問 を見ましたが、そのスレッドからこれを行う方法がわかりませんでした。

前もって感謝します。

29
Stephen Turner

これを行う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
41
Joshua Ulrich

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"
6
Gavin Simpson

もう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())
3
Karsten W.

リンクされたページに基づいた迅速なソリューション...

inlist <- strsplit(readLines("file.txt"), "[[:space:]]+")
pathways <- lapply(inlist, tail, n = -1)
names(pathways) <- lapply(inlist, head, n = 1)
3
JAShapiro