如何从R语言数据框的phone列提取指定元音填入vowel列?
解决R语言提取元音到vowel列的问题
错误原因分析
你原来的循环有两个核心问题:
- 未分割音素:
df$phone中的每个元素是完整的字符串(比如"DH, EH, AH"),不是单个音素,所以i %in% x永远为FALSE,根本没法匹配到元音。 - 全局赋值错误:就算匹配到内容,
df$vowel <- i会把整个vowel列覆盖成当前的i,而不是对应行的结果,最终只会保留最后一次循环的赋值。
正确解决方案
下面提供两种可行方法,你可以根据习惯选择:
方法1:使用tidyverse工具(dplyr + stringr)
先加载包,再处理数据:
# 定义元音列表和原始数据框 x <- c("IH","EH","AE","AH","OH","UH","IY","EY","AY","OY","AW","OW","ER","AA","AO") df <- data.frame( word = c("THERE", "MUSHROOM", "YOU", "IT'S"), phone = c("DH, EH, AH", "M, AH, SH, R, UW, M", "Y, UW", "IH, T, S"), vowel = NA, stringsAsFactors = FALSE ) # 加载tidyverse包 library(dplyr) library(stringr) # 处理vowel列 df <- df %>% mutate( # 将phone字符串分割为单个音素的列表 phone_list = str_split(phone, ",\\s+"), # 筛选出属于x的元音,再合并为字符串 vowel = map_chr(phone_list, ~paste(.x[.x %in% x], collapse = ", ")) ) %>% # 可选:删除中间生成的phone_list列 select(-phone_list)
方法2:使用Base R(无需额外包)
如果不想加载第三方包,用原生R代码也能实现:
# 定义元音列表和原始数据框 x <- c("IH","EH","AE","AH","OH","UH","IY","EY","AY","OY","AW","OW","ER","AA","AO") df <- data.frame( word = c("THERE", "MUSHROOM", "YOU", "IT'S"), phone = c("DH, EH, AH", "M, AH, SH, R, UW, M", "Y, UW", "IH, T, S"), vowel = NA, stringsAsFactors = FALSE ) # 逐行处理phone列 df$vowel <- sapply(strsplit(df$phone, ",\\s+"), function(phones) { # 筛选出元音 vowels <- phones[phones %in% x] # 合并为字符串,无元音则返回空字符串 paste(vowels, collapse = ", ") })
最终结果
执行上述代码后,你会得到期望的输出:
df # word phone vowel # 1 THERE DH, EH, AH EH, AH # 2 MUSHROOM M, AH, SH, R, UW, M AH # 3 YOU Y, UW # 4 IT'S IH, T, S IH
内容的提问来源于stack exchange,提问作者aoooooiiiiiiiiiiiiiii
相关产品推荐
相关产品推荐

