从命名列表中我想创建两列data.frame()
,列表名称出现在第一列中,列表元素出现在第二列中。
我设法做到了这一点,完成了工作,但远非优雅。
my_list <-
list("one_digit" = 0:9, "two_digits" = 10:29, "three_digits" = 100:111)
df <-
data.frame(from = names(unlist(my_list)), to = unlist(my_list), stringsAsFactors = TRUE)
df$from <- gsub("\\d+$","",df$from)
还有更优雅的解决方案吗?
答案 0 :(得分:3)
将我的评论转换为答案,您可以使用基础R中的stack
或来自&#34; reshape2&#34;的melt
:
此处stack
:
head(stack(my_list), 15)
## values ind
## 1 0 one_digit
## 2 1 one_digit
## 3 2 one_digit
## 4 3 one_digit
## 5 4 one_digit
## 6 5 one_digit
## 7 6 one_digit
## 8 7 one_digit
## 9 8 one_digit
## 10 9 one_digit
## 11 10 two_digits
## 12 11 two_digits
## 13 12 two_digits
## 14 13 two_digits
## 15 14 two_digits
此处melt
:
head(melt(my_list), 15)
## value L1
## 1 0 one_digit
## 2 1 one_digit
## 3 2 one_digit
## 4 3 one_digit
## 5 4 one_digit
## 6 5 one_digit
## 7 6 one_digit
## 8 7 one_digit
## 9 8 one_digit
## 10 9 one_digit
## 11 10 two_digits
## 12 11 two_digits
## 13 12 two_digits
## 14 13 two_digits
## 15 14 two_digits
这两种方法的一个区别是melt
会自动创建&#34; L1&#34;列,即使列表没有名称,也可以使用嵌套列表。
head(melt(unname(my_list)), 15)
## value L1
## 1 0 1
## 2 1 1
## 3 2 1
## 4 3 1
## 5 4 1
## 6 5 1
## 7 6 1
## 8 7 1
## 9 8 1
## 10 9 1
## 11 10 2
## 12 11 2
## 13 12 2
## 14 13 2
## 15 14 2