Определить наличие или отсутствие строки в шаблоне с помощью R - PullRequest
1 голос
/ 16 апреля 2020

Я новичок в кодировании R. Мне нужна рука, чтобы найти элегантный способ сделать это:

У меня есть следующий фрейм данных:

> df = data.frame(pattern=c('a,b,c','b','c,b','c'), nb=c(150,100,30,10))
> df
  pattern  nb
1   a,b,c  150
2       b  100
3     c,b  30
4       c  10

В зависимости от наличия строки, я хочу фрейм данных такого типа:

  pattern   nb    a    b     c
1   a,b,c   150   150  150   150
2       b   100   0    100   0
3     c,b   30    0    30    30
4       c   10    0    0     10

Я нахожу это решение:

df$a <- ifelse(grepl("a" , df$pattern), df$nb, 0)
df$b <- ifelse(grepl("b" , df$pattern), df$nb, 0)
df$c <- ifelse(grepl("c" , df$pattern), df$nb, 0)

Но в моем реальном случае я получил много разных паттернов. Я уверен, что есть способ с al oop или функцией. Конечно, я не прошу готового решения. Я просто спрашиваю, как это сделать. Большое спасибо заранее.

Привет из Франции

Арно

1 Ответ

0 голосов
/ 16 апреля 2020

Один dplyr и tidyr параметр может быть:

df %>%
 mutate(nb2 = nb,
        pattern_split = strsplit(pattern, ",", fixed = TRUE)) %>%
 unnest(pattern_split) %>%
 pivot_wider(names_from = "pattern_split", values_from = "nb2", values_fill = list(nb2 = 0))

  pattern    nb     a     b     c
  <chr>   <dbl> <dbl> <dbl> <dbl>
1 a,b,c     150   150   150   150
2 b         100     0   100     0
3 c,b        30     0    30    30
4 c          10     0     0    10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...