используйте dplyr для мутирования вместе 3 столбца (без разделов c) - PullRequest
0 голосов
/ 19 апреля 2020

Здравствуйте, у меня есть фрейм данных, такой как:

Name        Col1 Col2 Col2
Wolf_+_     <NA> <NA> <NA>
Fox_-_      <NA> <NA> <NA>
Lezard_-_   <NA> <NA> <NA>
Elephant_-_ <NA> <NA> <NA>
AZ_89809    BOL  RAL   ZIL
Bear_+_     <NA> <NA> <NA>
ZA_08980    LUI  OPL   YUI
TY_880DD2   IOP  MPO   UII
Snail_-_    <NA> <NA> <NA>

И я действительно хочу создать Col3, чтобы объединить все Name+Col1+Col2 BUT только для значения в имени, которое не иметь + или - в своем названии.

dplyr::mutate(df , Col3 = paste(Name,Col1,Col2 sep='|'))

и получите:

Name        Col1 Col2 Col2 Col3
Wolf_+_     <NA> <NA> <NA> Wolf_+_|NA|NA|NA
Fox_-_      <NA> <NA> <NA> Fox_-_|NA|NA|NA
Lezard_-_   <NA> <NA> <NA> Lezard_-_|NA|NA|NA
Elephant_-_ <NA> <NA> <NA> Elephant_-_|NA|NA|NA
AZ_89809    BOL  RAL   ZIL AZ_89809|BOL|RAL|ZIL
Bear_+_     <NA> <NA> <NA> Bear_+_|NA|NA|NA
ZA_08980    LUI  OPL   YUI ZA_08980|LUI|OPL|YUI
TY_880DD2   IOP  MPO   UII TY_880DD2|IOP|MPO|UII
Snail_-_    <NA> <NA> <NA> Snail_-_|NA|NA|NA

, и я хотел бы получить:

Name        Col1 Col2 Col2 Col3
Wolf_+_     <NA> <NA> <NA> Wolf_+_
Fox_-_      <NA> <NA> <NA> Fox_-_
Lezard_-_   <NA> <NA> <NA> Lezard_-_
Elephant_-_ <NA> <NA> <NA> Elephant_-_
AZ_89809    BOL  RAL   ZIL AZ_89809|BOL|RAL|ZIL
Bear_+_     <NA> <NA> <NA> Bear_+_
ZA_08980    LUI  OPL   YUI ZA_08980|LUI|OPL|YUI
TY_880DD2   IOP  MPO   UII TY_880DD2|IOP|MPO|UII
Snail_-_    <NA> <NA> <NA> Snail_-_

Ответы [ 3 ]

2 голосов
/ 19 апреля 2020

Используя stringr::str_detect и ifelse, этого также можно достичь следующим образом:

library(dplyr)
library(stringr)

df %>%
  mutate(Col3 = ifelse(str_detect(Name, "(\\+|\\-)"), Name, paste(Name, Col1, Col2, Col2.1, sep = "|")))
#>          Name Col1 Col2 Col2.1                  Col3
#> 1     Wolf_+_ <NA> <NA>   <NA>               Wolf_+_
#> 2      Fox_-_ <NA> <NA>   <NA>                Fox_-_
#> 3   Lezard_-_ <NA> <NA>   <NA>             Lezard_-_
#> 4 Elephant_-_ <NA> <NA>   <NA>           Elephant_-_
#> 5    AZ_89809  BOL  RAL    ZIL  AZ_89809|BOL|RAL|ZIL
#> 6     Bear_+_ <NA> <NA>   <NA>               Bear_+_
#> 7    ZA_08980  LUI  OPL    YUI  ZA_08980|LUI|OPL|YUI
#> 8   TY_880DD2  IOP  MPO    UII TY_880DD2|IOP|MPO|UII
#> 9    Snail_-_ <NA> <NA>   <NA>              Snail_-_

Создано в 2020-04-19 пакетом Представить ( v0.3.0)

1 голос
/ 19 апреля 2020

Мы можем использовать unite из tidyr и удалить NA, используя na.rm = TRUE.

library(dplyr)

df %>%
  mutate_all(as.character) %>% 
  tidyr::unite(Col4, everything(), sep = "|", na.rm = TRUE, remove = FALSE)

#                   Col4        Name Col1 Col2 Col3
#1               Wolf_+_     Wolf_+_ <NA> <NA> <NA>
#2                Fox_-_      Fox_-_ <NA> <NA> <NA>
#3             Lezard_-_   Lezard_-_ <NA> <NA> <NA>
#4           Elephant_-_ Elephant_-_ <NA> <NA> <NA>
#5  AZ_89809|BOL|RAL|ZIL    AZ_89809  BOL  RAL  ZIL
#6               Bear_+_     Bear_+_ <NA> <NA> <NA>
#7  ZA_08980|LUI|OPL|YUI    ZA_08980  LUI  OPL  YUI
#8 TY_880DD2|IOP|MPO|UII   TY_880DD2  IOP  MPO  UII
#9              Snail_-_    Snail_-_ <NA> <NA> <NA>
0 голосов
/ 19 апреля 2020

Вы также можете просто добавить это:

library(dplyr); library(stringr);

dplyr::mutate(df , Col3 = paste(Name,Col1,Col2 sep='|')) %>% 
       str_replace(df[,3],"\\|NA\\|NA\\|NA","")

, который в основном удаляет |NA|NA|NA, чтобы получить желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...