提问人:george1994 提问时间:4/29/2022 最后编辑:george1994 更新时间:4/29/2022 访问量:32
如何将一列的数据帧拆分为不同列的数据帧?
How to split up a dataframe with one column into a dataframe with different columns?
问:
我以前问过类似的问题,并试图在我的项目中使用答案(非常好),但我失败了。我有以下数据帧:
library(rvest)
library(dplyr)
library(janitor)
library(dplyr)
library(stringr)
library(tidyverse)
link = "https://www.wahlrecht.de/umfragen/forsa/1998.htm"
page = read_html(link)
data1 = page %>% html_nodes("td") %>% html_text()
data1=data.frame(data1)
data1=data1[!apply(data1 == "–", 1, all),]
data1=data.frame(data1)
data1=data1[!apply(data1 == data1[4,1], 1, all),]
data1=data.frame(data1)
data1=data1[-c(1,2),1]
data1=data.frame(data1)
Data1 现在有一列,其中包含百分比数字和日期。我想拆分数据 1 的(一)列,并为每个日期创建一个具有以下百分比值的新列。我用以下代码尝试过,但这不起作用:
data1 %>%
group_by(idx = cumsum(x==data1[nchar(data1[,1])==10,1])) %>%
filter(x != data1[nchar(data1[,1])==10,1]) %>%
mutate(rn = row_number()) %>%
pivot_wider(names_from = idx, values_from = x, names_prefix = data1[nchar(data1[,1])==10,1]) %>%
select(-rn)
我将不胜感激任何答案/解决方案。谢谢。
PS:我知道我的代码可以缩短,可能并不完美,但如果它有效,我可以忍受。
答:
2赞
Andy Baxter
4/29/2022
#1
您可能会发现该函数在 html 提取点执行了您想要执行的大部分操作:html_table()
library(rvest)
library(janitor)
library(tidyverse)
link = "https://www.wahlrecht.de/umfragen/forsa/1998.htm"
page = read_html(link)
data1 = page %>% html_elements(".wilko") %>% html_table()
data1 <- data1[[1]]
data1
#> # A tibble: 59 x 9
#> `` `` `CDU/CSU` SPD GRÜNE FDP PDS Rechte Sonstige
#> <chr> <lgl> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 "" NA CDU/CSU SPD GRÜNE FDP PDS Rechte Sonstige
#> 2 "17.12.1998" NA 37 % 40 % 6 % 5 % 5 % – 7 %
#> 3 "10.12.1998" NA 39 % 38 % 6 % 5 % 6 % – 6 %
#> 4 "03.12.1998" NA 39 % 38 % 7 % 5 % 5 % – 6 %
#> 5 "26.11.1998" NA 38 % 38 % 7 % 5 % 5 % – 7 %
#> 6 "19.11.1998" NA 37 % 39 % 7 % 6 % 6 % – 5 %
#> 7 "12.11.1998" NA 38 % 39 % 6 % 6 % 6 % – 5 %
#> 8 "05.11.1998" NA 38 % 39 % 7 % 6 % 5 % – 5 %
#> 9 "29.10.1998" NA 39 % 39 % 6 % 6 % 5 % – 5 %
#> 10 "Wahl 1998" NA 35,1 % 40,9 % 6,7 % 6,2 % 5,1 % 3,3 % 2,6 %
#> # ... with 49 more rows
创建于 2022-04-29 由 reprex 包 (v2.0.1)
评论
1赞
george1994
4/29/2022
谢谢。这使得它变得简单得多^^
0赞
Andrea M
4/29/2022
#2
您可以使用将列划分为包含 7 项向量的列表,并使用 将日期更改为列名:split
janitor
row_to_names
split(data1$data1, ceiling(seq_along(data1$data1)/7)) |>
as.data.frame() |>
janitor::row_to_names(row_number = 1)
如果每个日期后面都像您描述的那样正好是 6 个百分比,这将正常工作,但例如,在有 7 个百分比之后,同样在 之后,这就会中断。Wahl 1998
20.08.1998
该解决方案可能对有类似问题但数据更常规的人有所帮助。
评论