如何在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 , '\\",') #k1 = strsplit(amm_ord , '"\\",\\""\\"') 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
相关产品推荐
相关产品推荐

