我生成了以下列表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函数可以快速执行此操作?我可以使用“暴力”来做到这一点,但是当我考虑更大的列表时,我的解决方案不能很好地扩展。
我感谢你们所有人!
答案 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"