我前几天问过这个问题,网友的回答解决了:
解决方案的步骤之一是使用“:”作为分隔符;问题是我正在使用的数据集的字符串中有一些“:”不是分隔符。例如:
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 个值太短了。
您可以使用
": "
作为分隔符来克服这个问题(并且不需要修剪滞后/超前空间)。
(例如添加“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