Условно отделить () с помощью трубы

Рассмотрим некоторые данные многоязычного словаря, например:

df <- structure(list(tra = c("1. authority, responsibility, dominion / autorité, responsabilité, pouvoir", "2. ability / capacité", "half, part, some / moitié, partie d'un tout", "do, make, operate, execute / faire, opérer, exécuter", "do (etc.) f.o.b. / faire (etc.) pour soi", "1. manière de réveiller. 2. manière de redonner la vie à un mort", "1. qui peut réveiller. 2. qui est capable de redonner la vie à un mort", "A. manière de respirer / respiration. B. vie", "A. manière de respirer / respiration. B. vie", "A. respirer. B. réveiller. C. être libre"), language = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), .Label = c("Afar", "Kabiye" ), class = "factor"), metalanguage = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), .Label = c("en/fr", "fr"), class = "factor")), .Names = c("tra", "language", "metalanguage"), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))

Поле tra иногда содержит английский и французский переводы, разделенные знаком /, иногда только французский, как записано в поле metalanguage. Вот чего я хочу добиться:

  • оставьте столбец tra без изменений и добавьте два дополнительных столбца tra_fr и tra_en
  • if metalanguage == "en/fr", useseparate () _ 9_tra_enandtra_fr`
  • если metalanguage == "fr", filltra_frwithtra`
  • делайте все это как часть большей последовательности глаголов dplyr, переданных по конвейеру.

Сначала я выбрал separate(tra,c("tra_en","tra_fr"), " / ", remove=F), но потом обнаружил, что "/" также используется в некоторых переводах, предназначенных только для французского (ура, если данные противоречивы). Поэтому мне нужен способ условно применить separate() и mutate() глаголы на основе поля metalanguage. Как это сделать в трубе?

(Я изучал несколько предыдущих вопросов об использовании условных выражений и if_else () с конвейерными dplyr-глаголами, но пока мне не удалось применить то, что описано для mutate (), для отделения ().)


person strangeloop    schedule 24.07.2017    source источник


Ответы (2)


Вы можете использовать group_by %>% do и для каждой группы отметьте соответственно metalanguage и отдельный:

df %>% group_by(metalanguage) %>% do({
    if(.$metalanguage[1] == "en/fr") 
        separate(., tra, c("tra_en", "tra_fr"), " / ", remove=FALSE) 
    else 
        mutate(., tra_fr = tra)
}) %>% as.data.frame()

#                                                                          tra                                 tra_en
#1  1. authority, responsibility, dominion / autorité, responsabilité, pouvoir 1. authority, responsibility, dominion
#2                                                       2. ability / capacité                             2. ability
#3                                 half, part, some / moitié, partie d'un tout                       half, part, some
#4                        do, make, operate, execute / faire, opérer, exécuter             do, make, operate, execute
#5                                    do (etc.) f.o.b. / faire (etc.) pour soi                       do (etc.) f.o.b.
#6            1. manière de réveiller. 2. manière de redonner la vie à un mort                                   <NA>
#7      1. qui peut réveiller. 2. qui est capable de redonner la vie à un mort                                   <NA>
#8                                A. manière de respirer / respiration. B. vie                                   <NA>
#9                                A. manière de respirer / respiration. B. vie                                   <NA>
#10                                   A. respirer. B. réveiller. C. être libre                                   <NA>
#                                                                   tra_fr language metalanguage
#1                                       autorité, responsabilité, pouvoir     Afar        en/fr
#2                                                                capacité     Afar        en/fr
#3                                                moitié, partie d'un tout     Afar        en/fr
#4                                                 faire, opérer, exécuter     Afar        en/fr
#5                                                   faire (etc.) pour soi     Afar        en/fr
#6        1. manière de réveiller. 2. manière de redonner la vie à un mort   Kabiye           fr
#7  1. qui peut réveiller. 2. qui est capable de redonner la vie à un mort   Kabiye           fr
#8                            A. manière de respirer / respiration. B. vie   Kabiye           fr
#9                            A. manière de respirer / respiration. B. vie   Kabiye           fr
#10                               A. respirer. B. réveiller. C. être libre   Kabiye           fr
person Psidom    schedule 24.07.2017
comment
Работает. Добавление en в качестве значения третьего фактора в metalanguage и добавление дополнительного условия с else if(.$metalanguage[1] == "en") mutate(., tra_en = tra) также работает. - person strangeloop; 24.07.2017

Вот вариант с использованием base R

i1 <- grepl("[/]", df$metalanguage)
df[c('tra_en', 'tra_fr')] <- NA
df[i1, c('tra_en', 'tra_fr')] <- read.csv(text=sub("[/]", ";", 
        df$tra[i1]), sep=";", header = FALSE, stringsAsFactors=FALSE)
df[!i1, 'tra_fr'] <- df[!i1, 'tra']
as.data.frame(df)
                                                                          #tra language metalanguage                                  tra_en
#1  1. authority, responsibility, dominion / autorité, responsabilité, pouvoir     Afar        en/fr 1. authority, responsibility, dominion 
#2                                                       2. ability / capacité     Afar        en/fr                             2. ability 
#3                                 half, part, some / moitié, partie d'un tout     Afar        en/fr                       half, part, some 
#4                        do, make, operate, execute / faire, opérer, exécuter     Afar        en/fr             do, make, operate, execute 
#5                                    do (etc.) f.o.b. / faire (etc.) pour soi     Afar        en/fr                       do (etc.) f.o.b. 
#6            1. manière de réveiller. 2. manière de redonner la vie à un mort   Kabiye           fr                                    <NA>
#7      1. qui peut réveiller. 2. qui est capable de redonner la vie à un mort   Kabiye           fr                                    <NA>
#8                                A. manière de respirer / respiration. B. vie   Kabiye           fr                                    <NA>
#9                                A. manière de respirer / respiration. B. vie   Kabiye           fr                                    <NA>
#10                                   A. respirer. B. réveiller. C. être libre   Kabiye           fr                                    <NA>
                                                                   #tra_fr
#1                                       autorité, responsabilité, pouvoir
#2                                                                capacité
#3                                                moitié, partie d'un tout
#4                                                 faire, opérer, exécuter
#5                                                   faire (etc.) pour soi
#6        1. manière de réveiller. 2. manière de redonner la vie à un mort
#7  1. qui peut réveiller. 2. qui est capable de redonner la vie à un mort
#8                            A. manière de respirer / respiration. B. vie
#9                            A. manière de respirer / respiration. B. vie
#10                               A. respirer. B. réveiller. C. être libre
person akrun    schedule 24.07.2017