在 R 中拆分数据框中的特定列

Split specific column in data frame in R

提问人:silent_hunter 提问时间:10/10/2023 更新时间:10/10/2023 访问量:56

问:

我正在使用 R。 下面你可以看到我的代码和我的数据:

df <- data.frame(
  R1 = c("10 EFTA : 0 / BAA/GBR : 0 / ES : 2", "10","0"),
  R2 = c("-", "EFTA : 0 / BAA/GBR : 0 / ES : 2","18")
)

enter image description here

现在我想拆分第一列 R1。一开始,我想用以下命令拆分第一行:

df[c('R1', 'R2')] <- str_split_fixed(df$R1, ' ', 2)

这一行正好是我需要的第一行,下面你可以看到它现在看起来像一个数据框。

enter image description here

但是下一行出现了问题。也就是说,现在您可以看到此值以及下一行中的值丢失。 所以任何人都可以帮助我如何解决这个问题,并让 df 像 df 一样如下所示:"EFTA : 0 / BAA/GBR : 0 / ES : 2"18

enter image description here

R 纵梁

评论


答:

1赞 dufei 10/10/2023 #1

您的算法何时选择定义不是很好但基于您想要的输出,例如以下代码的内容可能会起作用?

library(tidyverse)

df <- tibble(
  R1 = c("10 EFTA : 0 / BAA/GBR : 0 / ES : 2", "10","0"),
  R2 = c("-", "EFTA : 0 / BAA/GBR : 0 / ES : 2","18")
)

df |> 
  separate_wider_regex(
    R1,
    patterns = c(digits = "^\\d+", "(?:\\s+)?", rest = ".*")
  ) |> 
  mutate(rest = if_else(rest == "", R2, rest),
         .keep = "unused")
#> # A tibble: 3 × 2
#>   digits rest                           
#>   <chr>  <chr>                          
#> 1 10     EFTA : 0 / BAA/GBR : 0 / ES : 2
#> 2 10     EFTA : 0 / BAA/GBR : 0 / ES : 2
#> 3 0      18

创建于 2023-10-09 使用 reprex v2.0.2

1赞 margusl 10/10/2023 #2

您可以先找到匹配的行,然后只处理这些匹配项:

library(stringr)
df <- data.frame(
  R1 = c("10 EFTA : 0 / BAA/GBR : 0 / ES : 2", "10","0"),
  R2 = c("-", "EFTA : 0 / BAA/GBR : 0 / ES : 2","18")
)
df
#>                                   R1                              R2
#> 1 10 EFTA : 0 / BAA/GBR : 0 / ES : 2                               -
#> 2                                 10 EFTA : 0 / BAA/GBR : 0 / ES : 2
#> 3                                  0                              18

# boolean index to match rows where R1 includes " ":
spaces_in_r1 <- str_detect(df$R1, fixed(" "))
spaces_in_r1
#> [1]  TRUE FALSE FALSE

df[spaces_in_r1 ,c('R1', 'R2')] <- str_split_fixed(df$R1[spaces_in_r1], ' ', 2)
df
#>   R1                              R2
#> 1 10 EFTA : 0 / BAA/GBR : 0 / ES : 2
#> 2 10 EFTA : 0 / BAA/GBR : 0 / ES : 2
#> 3  0                              18

创建于 2023-10-09 使用 reprex v2.0.2