【问题标题】:Convert columns of data.frame from lists to vectors将 data.frame 的列从列表转换为向量
【发布时间】:2020-06-21 21:41:13
【问题描述】:

我有一个使用代码从列表“y”创建的 data.frame

map_dfr(y, ~as.data.frame(t(.x))) 

该格式对我有用,但数据框的每一列本身就是一个列表,而不是我想要的向量。我可以做些什么来展平每个列表,以便保留数据框的结构,但更改每列的格式?

编辑:这是当前格式的一小部分数据。我想要做的是将每个变量取消列出到一个向量中,因此它采用正常的 data.frame 格式。

structure(list(member_id = list("A000055", "A000361", "A000367", 
"A000369", "A000210", "B001256", "B000013", "B001279", "B001269", 
"B001282"), name = list("Robert B. Aderholt", "Rodney Alexander", 
"Justin Amash", "Mark Amodei", "Robert E. Andrews", "Michele Bachmann", 
"Spencer Bachus", "Ron Barber", "Lou Barletta", "Andy Barr"), 
party = list("R", "R", "R", "R", "D", "R", "R", "D", "R", 
    "R"), state = list("AL", "LA", "MI", "NV", "NJ", "MN", 
    "AL", "AZ", "PA", "KY"), district = list("4", "5", "3", 
    "2", "1", "6", "6", "2", "11", "6"), cook_pvi = list(
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    NULL), vote_position = list("No", "Yes", "No", "Yes", 
    "Yes", "No", "Yes", "Yes", "Yes", "Yes"), dw_nominate = list(
    0.361, 0.331, 0.649, 0.376, -0.297, 0.584, 0.387, -0.123, 
    0.277, 0.485), bill_num = c("S47", "S47", "S47", "S47", 
"S47", "S47", "S47", "S47", "S47", "S47"), bill_title = c("Violence Against Women Reauthorization Act of 2013", 
"Violence Against Women Reauthorization Act of 2013", "Violence Against Women Reauthorization Act of 2013", 
"Violence Against Women Reauthorization Act of 2013", "Violence Against Women Reauthorization Act of 2013", 
"Violence Against Women Reauthorization Act of 2013", "Violence Against Women Reauthorization Act of 2013", 
"Violence Against Women Reauthorization Act of 2013", "Violence Against Women Reauthorization Act of 2013", 
"Violence Against Women Reauthorization Act of 2013")), row.names = c(NA, 10L), class = "data.frame")

【问题讨论】:

  • 糟糕,抱歉,我创建了一部分数据,但忘记包含它。谢谢你提醒我。

标签: r list tidyverse


【解决方案1】:

也许,这就是你想要的:

y[] <- lapply(y, unlist)

这会将数据转换为正常的 data.frame 格式。

str(y)
#'data.frame':  10 obs. of  9 variables:
# $ member_id    : chr  "A000055" "A000361" "A000367" "A000369" ...
# $ name         : chr  "Robert B. Aderholt" "Rodney Alexander" "Justin Amash" "Mark Amodei" ...
# $ party        : chr  "R" "R" "R" "R" ...
# $ state        : chr  "AL" "LA" "MI" "NV" ...
# $ district     : chr  "4" "5" "3" "2" ...
# $ vote_position: chr  "No" "Yes" "No" "Yes" ...
# $ dw_nominate  : num  0.361 0.331 0.649 0.376 -0.297 0.584 0.387 -0.123 0.277 0.485
#$ bill_num     : chr  "S47" "S47" "S47" "S47" ...
# $ bill_title   : chr  "Violence Against Women Reauthorization Act of 2013" "Violence Against Women Reauthorization Act of 2013" "Violence Against Women Reauthorization Act of 2013" "Violence Against Women Reauthorization Act of 2013" ...

如果我们有多个长度的列表,我们可以使用unnest 并传递一系列列。

library(tidyr)
library(dplyr)

z <- y %>% 
       unnest(cols = member_id:district)  %>%
       type.convert(as.is = TRUE) %>%
       arrange(desc(district))

我们可以使用arrange(district) 对它们进行升序排序。

【讨论】:

  • 出于某种原因,这适用于我发布的示例数据,但不适用于完整的数据集。当我在 1,100 行的完整数据集上尝试它时,我得到一个列表作为输出,而不是 data.frame。
  • @ModalBro 你有多个长度的列表吗?试试y %&gt;% unnest(cols = member_id:district)
  • 这似乎可行,但是当我尝试在数据查看器中对列进行排序时,我收到了我之前遇到的以下错误:顺序错误(x [[col]],减少=相同(dir, "desc")) : 'orderVector1' 中未实现的类型'list'
  • 我没有数据,所以不能确定,但​​也许可以试试更新的答案。
  • 看起来有些变量仍保留为列表,但如果我在该特定变量上调用 unlist() 然后将其分配回去,它就会转换。所以我想现在这会起作用。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 2021-02-22
  • 2013-08-18
相关资源
最近更新 更多