我正在从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
答案 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 可以从strsplit
和unnest
塑造不同的tidyr解决方案:
df.0 %>%
mutate(names = strsplit(names, "\\s+")) %>%
unnest
给予:
bill names
1 HB1 a
2 HB1 b
3 HB2 a
2)堆栈/拼凑:该替代方法不使用任何程序包。在这里,我们使用strsplit
将names
拆分为字符向量列表。在其中添加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