如何在R中将列列表转换为数据框

时间:2018-12-21 16:39:15

标签: r

我正在从pdf抓取投票历史数据。名称由单个变量中的空格分隔。要更改数据框,以便在名称的单独列中

将名称分开并消除空格。它在数据框中的新列中生成了一个长度不一的列表(取决于谁投票给它)。此外,还尝试了separate软件包中的dplyr函数。

#data.frame as is
bill <- c("HB1", "HB2")
names <- c("a    b", "a")
df.0 <- data.frame(bill = bill, names = names, stringsAsFactors = F)
df.0

#data.frame desired
bill <- c("HB1", "HB1", "HB2")
names <- c("a", "b", "a")
df.1 <- data.frame(bill = bill, names = names, stringsAsFactors = F)
df.1

2 个答案:

答案 0 :(得分:3)

尝试:

library(tidyr)
separate_rows(df.0, names)

# output
  bill names
1  HB1     a
2  HB1     b
3  HB2     a

答案 1 :(得分:0)

1)tidyr :: separate_rows 在tidyr中尝试separate_rows

library(dplyr)
library(tidyr)

df.0 %>% separate_rows(names)

给予:

  bill names
1  HB1     a
2  HB1     b
3  HB2     a

1a)tidyr :: unnest 可以从strsplitunnest塑造不同的tidyr解决方案:

df.0 %>%
  mutate(names = strsplit(names, "\\s+")) %>%
  unnest

给予:

  bill names
1  HB1     a
2  HB1     b
3  HB2     a

2)堆栈/拼凑:该替代方法不使用任何程序包。在这里,我们使用strsplitnames拆分为字符向量列表。在其中添加bill名称,然后使用stack将其重新命名为data.frame。 stack将使用硬编码名称,因此请使用setNames将名称重新设置。

setNames(with(df.0, stack(setNames(strsplit(names, "\\s+"), bill)))[2:1], names(df.0))

给予:

  bill names
1  HB1     a
2  HB1     b
3  HB2     a