如何将一列的数据帧拆分为不同列的数据帧?

How to split up a dataframe with one column into a dataframe with different columns?

提问人:george1994 提问时间:4/29/2022 最后编辑:george1994 更新时间:4/29/2022 访问量:32

问:

我以前问过类似的问题,并试图在我的项目中使用答案(非常好),但我失败了。我有以下数据帧:

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:我知道我的代码可以缩短,可能并不完美,但如果它有效,我可以忍受。

r 数据帧 tidyverse 多列 rvest

评论


答:

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 项向量的列表,并使用 将日期更改为列名:splitjanitorrow_to_names

split(data1$data1, ceiling(seq_along(data1$data1)/7)) |>
  as.data.frame() |>
  janitor::row_to_names(row_number = 1)

如果每个日期后面都像您描述的那样正好是 6 个百分比,这将正常工作,但例如,在有 7 个百分比之后,同样在 之后,这就会中断。Wahl 199820.08.1998

该解决方案可能对有类似问题但数据更常规的人有所帮助。