【问题标题】:R: Unlist into a two columns dataframe (name, value)R:取消列出到两列数据框(名称,值)
【发布时间】:2016-02-22 07:32:44
【问题描述】:

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

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

【问题讨论】:

  • stack(my_list) 也可以。
  • @AnandaMahto 猜猜这就是解决方案。 :-)
  • @AnandaMahto 也许您应该将您的评论放入答案中。
  • @AnandaMahto 知道了 :-)

标签: r list dataframe


【解决方案1】:

将我的 cmets 转换为答案,您可以使用 base R 中的 stack 或“reshape2”中的 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 会自动创建“L1”列,即使列表没有名称,也可以使用嵌套列表。

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

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 2018-12-22
    • 1970-01-01
    • 2017-04-19
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多