使用 R 中的定界符将具有不同长度且没有模式的文本列拆分为多列
Split the text column with varied length and no pattern to multiple columns using delimiters in R
我有大约 13 列和 20,000 行数据。其中一列有描述细节。描述列有一个或多个值,使用“,”、“-”、“/”、“&”等分隔符分隔。需要根据使用的不同分隔符将 Description 列拆分为多个列。有些值可能只是一个词,不需要拆分。请帮我解决这个问题。
这是我试过的一段代码。但是它不起作用。
df=as.data.frame(openxlsx::read.xlsx("Sample data.xlsx",sheet=1,colNames=TRUE,skipEmptyRows=TRUE))
newdf <- data.frame()
for (i in 1:nrow(df))
{
out <- strsplit(as.character(df$SHORT_DESC[i]),',')
newdf <- rbind(newdf, data.frame(t(sapply(out, `[`))))
}
在此之后,我计划按列合并原始数据框(不包括描述)和新数据框(描述分隔在多列中)。但是我上面的代码失败了,我也想用几行代码来执行这个操作。
输入和输出:
NO SHORT_DESC
1 SEAT, HELICAL, COMPRESSION SPRING
2 RIVET, SOLID, 100 DEGREE COUNTERSUNK HEA
3 WIRE,NICKEL-COPPER,BULK
4 INDUCTOR/ EMI SUPPRESSION
5 CHOKE
6 NOM PLATE & LENS
No SHORT_DESC1 SHORT_DESC2 SHORT_DESC3 SHORT_DESC4
1 SEAT HELICAL COMPRESSION SPRING
2 RIVET SOLID 100 DEGREE COUNTERSUNK HEA
3 WIRE NICKEL COPPER BULK
4 INDUCTOR EMI SUPPRESSION
5 CHOKE
6 NOM PLATE LENS
你可以
your_data %>%
tidyr::separate(SHORT_DESC, sep = "[,/] *",
into = paste0("SHORT_DESC", 1:999)) %>%
janitor::remove_empty()
哪个returns
# A tibble: 6 x 4
NO SHORT_DESC1 SHORT_DESC2 SHORT_DESC3
<dbl> <chr> <chr> <chr>
1 1 SEAT HELICAL COMPRESSION SPRING
2 2 RIVET SOLID 100 DEGREE COUNTERSUNK HEA
3 3 WIRE NICKEL-COPPER BULK
4 4 INDUCTOR EMI SUPPRESSION NA
5 5 CHOKE NA NA
6 6 NOM PLATE & LENS NA NA
使用的数据:
your_data <- tibble::tribble(~NO, ~SHORT_DESC, 1, "SEAT, HELICAL, COMPRESSION SPRING", 2, "RIVET, SOLID, 100 DEGREE COUNTERSUNK HEA", 3, "WIRE,NICKEL-COPPER,BULK", 4, "INDUCTOR/ EMI SUPPRESSION", 5, "CHOKE", 6, "NOM PLATE & LENS")
我有大约 13 列和 20,000 行数据。其中一列有描述细节。描述列有一个或多个值,使用“,”、“-”、“/”、“&”等分隔符分隔。需要根据使用的不同分隔符将 Description 列拆分为多个列。有些值可能只是一个词,不需要拆分。请帮我解决这个问题。
这是我试过的一段代码。但是它不起作用。
df=as.data.frame(openxlsx::read.xlsx("Sample data.xlsx",sheet=1,colNames=TRUE,skipEmptyRows=TRUE))
newdf <- data.frame()
for (i in 1:nrow(df))
{
out <- strsplit(as.character(df$SHORT_DESC[i]),',')
newdf <- rbind(newdf, data.frame(t(sapply(out, `[`))))
}
在此之后,我计划按列合并原始数据框(不包括描述)和新数据框(描述分隔在多列中)。但是我上面的代码失败了,我也想用几行代码来执行这个操作。
输入和输出:
NO SHORT_DESC
1 SEAT, HELICAL, COMPRESSION SPRING
2 RIVET, SOLID, 100 DEGREE COUNTERSUNK HEA
3 WIRE,NICKEL-COPPER,BULK
4 INDUCTOR/ EMI SUPPRESSION
5 CHOKE
6 NOM PLATE & LENS
No SHORT_DESC1 SHORT_DESC2 SHORT_DESC3 SHORT_DESC4
1 SEAT HELICAL COMPRESSION SPRING
2 RIVET SOLID 100 DEGREE COUNTERSUNK HEA
3 WIRE NICKEL COPPER BULK
4 INDUCTOR EMI SUPPRESSION
5 CHOKE
6 NOM PLATE LENS
你可以
your_data %>%
tidyr::separate(SHORT_DESC, sep = "[,/] *",
into = paste0("SHORT_DESC", 1:999)) %>%
janitor::remove_empty()
哪个returns
# A tibble: 6 x 4
NO SHORT_DESC1 SHORT_DESC2 SHORT_DESC3
<dbl> <chr> <chr> <chr>
1 1 SEAT HELICAL COMPRESSION SPRING
2 2 RIVET SOLID 100 DEGREE COUNTERSUNK HEA
3 3 WIRE NICKEL-COPPER BULK
4 4 INDUCTOR EMI SUPPRESSION NA
5 5 CHOKE NA NA
6 6 NOM PLATE & LENS NA NA
使用的数据:
your_data <- tibble::tribble(~NO, ~SHORT_DESC, 1, "SEAT, HELICAL, COMPRESSION SPRING", 2, "RIVET, SOLID, 100 DEGREE COUNTERSUNK HEA", 3, "WIRE,NICKEL-COPPER,BULK", 4, "INDUCTOR/ EMI SUPPRESSION", 5, "CHOKE", 6, "NOM PLATE & LENS")