R:取消列入两列数据框(名称,值)

时间:2016-02-22 07:32:45

标签: r list dataframe

从命名列表中我想创建两列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)

还有更优雅的解决方案吗?

1 个答案:

答案 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