2017-02-26 73 views
0

我已經得到了採取這種形式載體列表:如何將矢量列表分割爲列或矩陣?

> g 
[[1]] 
[1] "L" "14" "L" "39" "L" "61" "B" "0" "L" "15" "L" "59" "W" "64" 

[[2]] 
[1] "L" "62" "D" "31" "L" "10" "L" "30" "B" "0" "D" "45" "L" "43" 

[[3]] 
[1] "H" "0" "L" "11" "L" "35" "W" "45" "H" "0" "L" "40" "L" "42" 

我的目標是在這個結構使用mapply,把每個14列到載體。第一列是:

[[1]] 
[1] "L" 

[[2]] 
[1] "L" 

[[3]] 
[1] "H" 

,第二列是:

[[1]] 
[1] "14" 

[[2]] 
[1] "62" 

[[3]] 
[1] "0" 

等。我懷疑這個結構是矩陣(?),但我不確定。我用了很多lapplystringrstr_extract_all與正則表達式來獲得這一點,但我不確定如何繼續。我懷疑這個函數會使用像這樣的模式:"[A-Z]{1}"作爲文本,"[:digit:]{1}",我知道mapply可以返回一個矩陣,但我不知道從哪裏開始。

+1

使用regexs這裏沒有任何意義。也許這將有助於解釋這些數據來自何處(例如,csv文件,網頁抓取,手動輸入)以及您需要如何使用它(例如,使用'pkg :: xyz()'繪製它)。 (爲了清楚起見,你的第一個塊是一個簡單的'list',其中每個元素都是一個'character'向量(不是列表)。你的第二個和第三個塊都是相同的:一個簡單的'list',每個元素都是'字符「向量(長度爲1) – r2evans

+0

我不知道R - 但我同意@ r2evans正則表達式在這裏看起來有點矯枉過正,一點點谷歌搜索導致我這樣:http://stackoverflow.com/questions/8464312/ convert-comma-separated-entry-to-columns看起來相當接近,但我不打算假裝我知道R並嘗試改變以適應你的場景。 – Theo

+0

它是一個更大的集合中的一小部分模式,這是拆分文件 - 這只是它的一部分,我基本上在尋找'函數',將其作爲一個矩陣或一系列列表輸出 – jmb277

回答

1

下面是使用mapply

g <- list() 
g[[1]] <- c("L", "14", "L", "39", "L", "61", "B", "0", "L", "15", "L", "59", "W", "64") 
g[[2]] <- c("L", "62", "D", "31", "L", "10", "L", "30", "B", "0", "D", "45", "L", "43") 
g[[3]] <- c("H", "0", "L", "11", "L", "35", "W", "45", "H", "0", "L", "40", "L", "42") 

考慮要提取第一個元素在每個列表元素的簡單情況下的解決方案,你可以lapply使用:

lapply(g, function (x) x[1]) 

現在我們可以mapply使用迭代:

lengths(g) # returns length of each element in the list 
g2 <- mapply(function(y) lapply(g, function (x) x[y]), 1:lengths(g)[1]) 
g2 

#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] 
# [1,] "L" "14" "L" "39" "L" "61" "B" "0" "L" "15" "L" "59" "W" "64" 
# [2,] "L" "62" "D" "31" "L" "10" "L" "30" "B" "0" "D" "45" "L" "43" 
# [3,] "H" "0" "L" "11" "L" "35" "W" "45" "H" "0" "L" "40" "L" "42" 

g2[,1] 
# [[1]] 
# [1] "L" 

# [[2]] 
# [1] "L" 

# [[3]] 
# [1] "H" 

unlist(g2[,1]) 
# [1] "L" "L" "H" 
+4

'do.call(rbind, g)'讓矩陣變得更短/更快(從另一個評論中複製,因爲已被刪除)。 – r2evans

+0

_this_是吧,夥計!謝謝! '()()'會派上用場。快速後續操作:'lapply(g,function(x)x [1])'中的函數'function(x)x [1]''將會和'function(x){x [1 ]}'? – jmb277

+0

do.call r2evans的好電話,我忘了那個。 @ jmb277,{}允許您對語句進行分組,允許您在函數體中放置多個語句。 – Djork

1

作爲do.call(rbind, g)的替代方案,我們可以使用數據.frame實際上是所有矢量具有相同長度的矢量列表。因此,給定的結構g可以轉換爲數據幀,然後轉置產生所請求的矩陣。

重現數據:

g <- list(
    c("L", "14", "L", "39", "L", "61", "B", "0", "L", "15", "L", "59", "W", "64"), 
    c("L", "62", "D", "31", "L", "10", "L", "30", "B", "0", "D", "45", "L", "43"), 
    c("H", "0", "L", "11", "L", "35", "W", "45", "H", "0", "L", "40", "L", "42") 
) 

變換:

m <- t(as.data.frame(g)) 
dimnames(m) <- NULL # remove deafault row names 
m 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] 
#[1,] "L" "14" "L" "39" "L" "61" "B" "0" "L" "15" "L" "59" "W" "64" 
#[2,] "L" "62" "D" "31" "L" "10" "L" "30" "B" "0" "D" "45" "L" "43" 
#[3,] "H" "0" "L" "11" "L" "35" "W" "45" "H" "0" "L" "40" "L" "42" 

訪問列:

​​
+0

這也是一個非常好的解決方案!我將不得不閱讀「do.call」,因爲幫助部分相當一般! – jmb277