将字符列分隔为行并将多列合并为 r 中的一列的最有效方法
Most efficient way to separate character columns into rows and combine multiple columns into one column in r
已更新
我在网上抓取了一个 table,实际上它的结构并不是 table。我设法将字符分成多行,但为了将来参考,我想知道对更大的数据集执行此操作的更有效方法。
我也能够将所有内容都放在一栏中,但整个代码效率极低。有什么改进建议吗?
library(rvest)
library(tidyverse)
library(dplyr)
url = "https://www.ncsl.org/research/health/state-laws-and-legislation-related-to-biologic-medications-and-substitution-of-biosimilars.aspx"
webpage=read_html(url)
mandatory_2014 = webpage %>%
html_element(css = "#dnn_ctr84472_HtmlModule_lblContent > div > table:nth-child(15)") %>%
html_table()
mandatory_2014 = data.frame(mandatory_2014)
df = mandatory_2014 %>%
mutate(X1=strsplit(X1, "\n\n\t\t\t")) %>%
unnest(X1) %>%
mutate(X2=strsplit(X2, "\n\n\t\t\t")) %>%
unnest(X3)%>%
mutate(X3=strsplit(X3, "\n\n\t\t\t")) %>%
unnest(X3)
df = df[-c(2)]
df = stack(df)
df = df[-c(2)]
df = data.frame(df[!duplicated(df),])
df = rename(df, States = df..duplicated.df....)
这可能在 base R
中更容易完成 - unlist
列到 vector
,然后替换 [=16] 的一个或多个(+
) =] 与单个 ,
以及删除从 (
开始的字符,然后使用 strsplit
或 scan
将字符串拆分为单独的元素(使用定界符,
),应用 trimws
删除任何剩余的 leading/lagging 空格,并将其转换为 data.frame
列
out <- data.frame(States = trimws(scan(text = sub("\s+\(.*", "",
gsub("(\n+\t+)", ",", mandatory_2014)), what="", sep=",")))
-输出
> out
States
1 Florida
2 Kansas
3 Kentucky
4 Massachusetts
5 Minnesota
6 Mississippi
7 Nevada
8 New Jersey
9 New York
10 Pennsylvania
11 Puerto Rico
12 Rhode Island
13 Washington
14 West Virginia
已更新
我在网上抓取了一个 table,实际上它的结构并不是 table。我设法将字符分成多行,但为了将来参考,我想知道对更大的数据集执行此操作的更有效方法。
我也能够将所有内容都放在一栏中,但整个代码效率极低。有什么改进建议吗?
library(rvest)
library(tidyverse)
library(dplyr)
url = "https://www.ncsl.org/research/health/state-laws-and-legislation-related-to-biologic-medications-and-substitution-of-biosimilars.aspx"
webpage=read_html(url)
mandatory_2014 = webpage %>%
html_element(css = "#dnn_ctr84472_HtmlModule_lblContent > div > table:nth-child(15)") %>%
html_table()
mandatory_2014 = data.frame(mandatory_2014)
df = mandatory_2014 %>%
mutate(X1=strsplit(X1, "\n\n\t\t\t")) %>%
unnest(X1) %>%
mutate(X2=strsplit(X2, "\n\n\t\t\t")) %>%
unnest(X3)%>%
mutate(X3=strsplit(X3, "\n\n\t\t\t")) %>%
unnest(X3)
df = df[-c(2)]
df = stack(df)
df = df[-c(2)]
df = data.frame(df[!duplicated(df),])
df = rename(df, States = df..duplicated.df....)
这可能在 base R
中更容易完成 - unlist
列到 vector
,然后替换 [=16] 的一个或多个(+
) =] 与单个 ,
以及删除从 (
开始的字符,然后使用 strsplit
或 scan
将字符串拆分为单独的元素(使用定界符,
),应用 trimws
删除任何剩余的 leading/lagging 空格,并将其转换为 data.frame
列
out <- data.frame(States = trimws(scan(text = sub("\s+\(.*", "",
gsub("(\n+\t+)", ",", mandatory_2014)), what="", sep=",")))
-输出
> out
States
1 Florida
2 Kansas
3 Kentucky
4 Massachusetts
5 Minnesota
6 Mississippi
7 Nevada
8 New Jersey
9 New York
10 Pennsylvania
11 Puerto Rico
12 Rhode Island
13 Washington
14 West Virginia