R:是否有内置函数来排序列表?

时间:2014-02-20 16:11:16

标签: r list

R中的

我生成了以下列表L

>L
[[1]]
[1] "A" "B" "C"  

[[2]]
[1] "D"  

[[3]]
[1] NULL

我想操作到达数据库L的列表df,如

>df
    df[,1] df[,2]
       "A"      1 
       "B"      1
       "C"      1 
       "D"      2

其中第2列给出第1列中相应元素的列表L中的位置。 我的问题是:是否有一个()内置的R函数可以快速执行此操作?我可以使用“暴力”来做到这一点,但是当我考虑更大的列表时,我的解决方案不能很好地扩展。

我感谢你们所有人!

2 个答案:

答案 0 :(得分:3)

由于您的warning值,您将获得NULL,但如果您提供列表项stack,则可以使用names

L <- list(c("A", "B", "C"), "D", NULL)
stack(setNames(L, seq_along(L)))
#   values ind
# 1      A   1
# 2      B   1
# 3      C   1
# 4      D   2
# Warning message:
# In stack.default(setNames(L, seq_along(L))) :
#   non-vector elements will be ignored

如果warning让您不高兴,您当然可以在非stack元素上运行NULL,但在您将列表元素命名为“ind”后执行此操作“列反映了正确的值。

为了清晰起见,我将分2步显示:

names(L) <- seq_along(L)
stack(L[!sapply(L, is.null)])

同样,如果您已删除NULL列表元素,则可以使用“reshape2”中的melt。你没有得到任何简洁的东西,我也不确定你在效率方面有什么收获,但我认为我会分享它作为一种选择。

library(reshape2)
names(L) <- seq_along(L)
melt(L[!sapply(L, is.null)])

答案 1 :(得分:2)

阿南达的回答似乎比这更好,但无论如何我都会提出来:

> cbind(unlist(L), rep(1:length(L), sapply(L, length)))
     [,1] [,2]
[1,] "A"  "1" 
[2,] "B"  "1" 
[3,] "C"  "1" 
[4,] "D"  "2"