数据集中的分隔符,但作为字符而不是分隔符

问题描述 投票:0回答:1

我前几天问过这个问题,网友的回答解决了:

根据标签将一列分隔在不同的列中

解决方案的步骤之一是使用“:”作为分隔符;问题是我正在使用的数据集的字符串中有一些“:”不是分隔符。例如:

F: Function1; F: Function2; P: proccess1; P: UTP:proccess2

用户建议我的方法是好的,但它不适用于这种特殊情况,当我想获取字符串“UTP:process2”时,我收到错误。我该如何解决呢?是一个非常大的数据集,因此很难知道这些条目在哪里。

我正在考虑修改数据集,但我不知道该怎么做。

提前谢谢您!!

我尝试了这个,正如 1 位用户建议我的那样:

library(tidyverse)

df <- tribble(
  ~Name, ~Value, ~GOs,
  "Ab1", "1000", "F: f1; F: f2; P: p1",
  "Bb1", "2000", "P: p1; F: f1",
  "Cb1", "3000", "C: c1; F: f1"
)

df |> 
  separate_longer_delim(GOs, delim = ";") |> 
  separate_wider_delim(GOs, delim = ":", names_sep = ":") |> 
  mutate(across(everything(), str_squish)) |> 
  pivot_wider(names_from = `GOs:1`, values_from = `GOs:2`) |> 
  unnest(c("F", "P", "C"))

#> # A tibble: 4 × 5
#>   Name  Value F     P     C    
#>   <chr> <chr> <chr> <chr> <chr>
#> 1 Ab1   1000  f1    p1    <NA> 
#> 2 Ab1   1000  f2    p1    <NA> 
#> 3 Bb1   2000  f1    p1    <NA> 
#> 4 Cb1   3000  f1    <NA>  c1

我收到此错误:

separate_wider_delim()
中的错误: !
GOs
的每个元素预计有 3 块。 ! 9 个值太短了。

r dataset tidyverse data-mining
1个回答
0
投票

您可以使用

": "
作为分隔符来克服这个问题(并且不需要修剪滞后/超前空间)。

(例如添加“UTP:process2”以重现您的错误)

library(tidyverse)

df <- tribble(
  ~Name, ~Value, ~GOs,
  "Ab1", "1000", "F: f1; F: f2; P: UTP:proccess2",
  "Bb1", "2000", "P: p1; F: f1",
  "Cb1", "3000", "C: c1; F: f1"
)

df |> 
  separate_longer_delim(GOs, delim = "; ") |> 
  separate_wider_delim(GOs, delim = ": ", names_sep = ":") |> 
  pivot_wider(names_from = `GOs:1`, values_from = `GOs:2`) |> 
  unnest(c("F", "P", "C"))
#> Warning: Values from `GOs:2` are not uniquely identified; output will contain list-cols.
#> • Use `values_fn = list` to suppress this warning.
#> • Use `values_fn = {summary_fun}` to summarise duplicates.
#> • Use the following dplyr code to identify duplicates.
#>   {data} |>
#>   dplyr::summarise(n = dplyr::n(), .by = c(Name, Value, `GOs:1`)) |>
#>   dplyr::filter(n > 1L)
#> # A tibble: 4 × 5
#>   Name  Value F     P             C    
#>   <chr> <chr> <chr> <chr>         <chr>
#> 1 Ab1   1000  f1    UTP:proccess2 <NA> 
#> 2 Ab1   1000  f2    UTP:proccess2 <NA> 
#> 3 Bb1   2000  f1    p1            <NA> 
#> 4 Cb1   3000  f1    <NA>          c1
© www.soinside.com 2019 - 2024. All rights reserved.