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

如何在R中从含属性集合的字符串列表提取所有唯一值?

问题

课程作业需求:分析数据框并得出统计结论,其中一个变量的字符串格式示例为:{obj1,"obj2",obj3,"obj4",obj5,"obj6",obj7,obj8,obj9,"obj10","obj11","obj12",obj13},带双引号的对象包含空格。需要提取所有元素并合并为列表,过滤掉{、"、\(部分含反斜杠)等符号。

尝试多种方法后编写的R代码及后续尝试均报错,错误涉及正则表达式格式无效、参数缺失等,具体代码与报错如下:

尝试的代码

#analyzing amenities
amm_ord = c(df1$amenities)
unique (amm_ord)
k = c()
for (elements in amm_ord){
  
  #for (element in elements) {k = append(k,unlist(element))
  #for (element in elements) {k = c( k , element )
  for (element in elements){
    k1 = strsplit(element, regexpr('“{  ,\\”  \\”,\\”  \\”,  \\”}' ,))
    k = c (k , k1)
    }
} 
uni_amm = unique(k)

print(uni_amm)

#k1 = strsplit(amm_ord , '\\",\\"  ,\\"  "{  ')
my_string <- "{  ,\",\",\",  \",  \"}"
k1 = strsplit(amm_ord , my_string)
k1 = strsplit(amm_ord , regexpr('“{  ,\\”  \\”,\\”  \\”,  \\”}'))
k1 = str_extract(k , regexpr('“{  ,\\”  \\”,\\”  \\”,  \\”}'))
#amm_ord = strsplit(k1 , '\\&quot;,')
#k1 = strsplit(amm_ord , '&quot;\\&quot;,\\&quot;&quot;\\&quot;')
unique(k1)
unique(amm_ord)

后续尝试的代码:

for (elements in amm_ord){
  
  for (element in elements){
    k1 = strsplit(element, regexpr('“{  ,\\”  \\”,\\”  \\”,  \\”}' ,[idk what to put here]))
    k = c (k , k1)
    }
} 

错误信息

Error in check_lengths(string, pattern) : 
  argument "pattern" is missing, with no default
>     k1 = str_extract(element, ('“{  ,\\”  \\”,\\”  \\”,  \\”}'))
Error in stri_extract_first_regex(string, pattern, opts_regex = opts(pattern)) : 
  Error in {min,max} interval. (U_REGEX_BAD_INTERVAL, context=`“{  ,\”  \”,\”  \”,  \”}`)
>     k1 = str_extract(element, regex('“{  ,\\”  \\”,\\”  \\”,  \\”}'))
Error in stri_extract_first_regex(string, pattern, opts_regex = opts(pattern)) : 
  Error in {min,max} interval. (U_REGEX_BAD_INTERVAL, context=`“{  ,\”  \”,\”  \”,  \”}`)
>     k1 = str_extract(element, regexpr('“{  ,\\”  \\”,\\”  \\”,  \\”}'))
Error in is.factor(text) : argument "text" is missing, with no default
>     k1 = strsplit(element, regexpr('“{  ,\\”  \\”,\\”  \\”,  \\”}'))
Error in is.factor(text) : argument "text" is missing, with no default
>     k1 = strsplit(element, regexpr('“{  ,\\”  \\”,\\”  \\”,  \\”}' , txt))
Error in is.factor(text) : object 'txt' not found
>     k1 = strsplit(element, regexpr('“{  ,\\”  \\”,\\”  \\”,  \\”}' , element))
Error in regexpr("“{  ,\\”  \\”,\\”  \\”,  \\”}", element) : 
  invalid regular expression, reason 'Invalid contents of {}'
> 

解决方案

核心问题是正则表达式写法错误,且对strsplit、regexpr等函数用法理解有误。以下是两种简洁可靠的实现方式:

方法一:使用stringr包处理

library(stringr)

# 1. 移除字符串首尾的{和}
clean_amenities <- str_remove_all(df1$amenities, "^\\{|\\}$")
# 2. 分割字符串:仅分割不在引号内的逗号
split_amenities <- str_split(clean_amenities, ",(?=(?:[^"]*\"[^"]*\")*[^"]*$)")
# 3. 展开为一维向量,清理引号与反斜杠
all_amenities <- unlist(split_amenities)
all_amenities <- str_remove_all(all_amenities, '["\\\\]')
# 4. 提取唯一元素
unique_amenities <- unique(all_amenities)

print(unique_amenities)

方法二:转为JSON格式解析(更稳定)

原字符串格式接近JSON数组,转为合法JSON后解析能自动处理带空格的元素:

library(jsonlite)

# 将{替换为[,}替换为],转为合法JSON数组
json_amenities <- gsub("\\{", "[", df1$amenities)
json_amenities <- gsub("\\}", "]", json_amenities)
# 解析JSON并展开为一维向量
split_amenities <- lapply(json_amenities, fromJSON)
all_amenities <- unlist(split_amenities)
# 提取唯一元素
unique_amenities <- unique(all_amenities)

print(unique_amenities)

代码说明

  • 方法一:利用正则正向预查精准分割元素,避免误切带引号内容里的逗号,再统一清理多余符号。
  • 方法二:借助JSON格式的兼容性,绕过复杂正则,直接解析得到干净的元素列表。

内容的提问来源于stack exchange,提问作者matteici

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:27:16