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

wixjitnu  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(117)

我正在与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")
)

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

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

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

但接下来的几行出现了问题。也就是说,现在你可以看到这个值"EFTA : 0 / BAA/GBR : 0 / ES : 2"和下一行的值18都丢失了。所以谁能帮我解决这个问题,并有像下面所示的df:

tyky79it

tyky79it1#

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

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

vlju58qv

vlju58qv2#

你的算法什么时候选择什么是不是很好地定义,但根据你想要的输出,像下面的代码可能会工作?

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

相关问题