2017-02-26 71 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