使用管道有条件地 separate()
Conditionally separate() using the pipe
考虑一些像这样的多语言词典数据:
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", use
separate()to split translation in to
tra_enand
tra_fr`
- if
metalanguage == "fr", fill
tra_frwith
tra`
- 将所有这些作为更大的管道 dplyr 动词序列的一部分进行。
我先去 separate(tra,c("tra_en","tra_fr"), " / ", remove=F)
,但后来
我发现“/”也用于一些仅法语的翻译(数据不一致是的)。所以我需要一些方法来根据 metalanguage
字段有条件地应用 separate()
和 mutate()
动词。我怎样才能在管道中做到这一点?
(我已经研究了几个关于使用条件句和 if_else() 与管道 dplyr 动词的先前问题,但到目前为止我还没有成功地将 mutate() 描述的内容应用到 separate()。)
您可以使用 group_by %>% do
,对于每个组,检查 metalanguage
和 separate 相应:
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
这是一个使用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
考虑一些像这样的多语言词典数据:
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", use
separate()to split translation in to
tra_enand
tra_fr` - if
metalanguage == "fr", fill
tra_frwith
tra` - 将所有这些作为更大的管道 dplyr 动词序列的一部分进行。
我先去 separate(tra,c("tra_en","tra_fr"), " / ", remove=F)
,但后来
我发现“/”也用于一些仅法语的翻译(数据不一致是的)。所以我需要一些方法来根据 metalanguage
字段有条件地应用 separate()
和 mutate()
动词。我怎样才能在管道中做到这一点?
(我已经研究了几个关于使用条件句和 if_else() 与管道 dplyr 动词的先前问题,但到目前为止我还没有成功地将 mutate() 描述的内容应用到 separate()。)
您可以使用 group_by %>% do
,对于每个组,检查 metalanguage
和 separate 相应:
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
这是一个使用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