You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从R语言数据框的phone列提取指定元音填入vowel列?

解决R语言提取元音到vowel列的问题

错误原因分析

你原来的循环有两个核心问题:

  1. 未分割音素:df$phone中的每个元素是完整的字符串(比如"DH, EH, AH"),不是单个音素,所以i %in% x永远为FALSE,根本没法匹配到元音。
  2. 全局赋值错误:就算匹配到内容,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:10:29