R语言 如何通过分隔符将一列拆分为多列(使用不同数量的分隔符)

ryevplcw  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(487)

我有一个类似这样的dataframe:

continent <- c("Europe", "Asia")
country <- c("France;Germany;Italy", "Japan")
start_problem <- data.frame(continent, country)
start_problem

我想将country列中的值分隔为多个列,每个国家一个。最终结果应该如下所示:

continent <- c("Europe", "Asia")
country1 <- c("France", "Japan")
country2 <- c("Germany", NA)
country3 <- c("Italy", NA)
goal <- data.frame(continent, country1, country2, country3)
goal

使用separate_wider_delim()不起作用,因为不是每个大洲都有相同数量的国家,因此原始列中的分隔符数量也不相同。
先谢了

bwleehnv

bwleehnv1#

我们可以首先通过查找定界符;的出现次数max来确定需要多少列。然后paste使用“country”字符串在separateinto =参数中获取信息。

library(tidyverse)

col_number <- max(str_count(start_problem$country, ";") + 1)

start_problem %>% separate(country, 
                           into = paste0("country", seq_len(col_number)), 
                           sep = ";")

  continent country1 country2 country3
1    Europe   France  Germany    Italy
2      Asia    Japan     <NA>     <NA>
ycggw6v2

ycggw6v22#

另一种选择是先用separate_rows分隔行。创建一个列,其中包含用于pivot_wider的名称,以使数据更宽,如下所示:

library(tidyverse)
start_problem %>%
  separate_rows(country, sep = ";") %>%
  mutate(col_name = paste0("country", row_number()), .by = continent) %>%
  pivot_wider(names_from = col_name, values_from = country)
#> # A tibble: 2 × 4
#>   continent country1 country2 country3
#>   <chr>     <chr>    <chr>    <chr>   
#> 1 Europe    France   Germany  Italy   
#> 2 Asia      Japan    <NA>     <NA>

创建于2023-03-31带有reprex v2.0.2

kdfy810k

kdfy810k3#

碱基R:

cbind(start_problem[1], read.csv2(text=start_problem[,2], header = FALSE))
  continent     V1      V2    V3
1    Europe France Germany Italy
2      Asia  Japan

如果您严格需要NA,则使用

cbind(start_problem[1], read.csv2(text=start_problem[,2], header = FALSE, na.strings = ''))
  continent     V1      V2    V3
1    Europe France Germany Italy
2      Asia  Japan    <NA>  <NA>

相关问题