使用splitstackshape包的cSplit_e函数实现非空格后逗号拆分
解决cSplit_e按特定逗号拆分的问题
要实现仅在逗号后无空格的位置拆分,关键是用正则表达式匹配目标分隔符,结合cSplit_e的参数设置就能搞定,具体步骤如下:
方法一:直接用正则分隔符
cSplit_e的sep参数支持正则表达式,只要设fixed=FALSE,函数就能识别正则规则。我们用,(?!\\s)当分隔符——这个正则的意思是"逗号后面紧跟的不是空白字符"(负向预查)。
完整代码:
library(splitstackshape) # 示例数据 id_num <- c("1","2","3","4","5") question <- c("Behavior; green, pink, blue,Sleep; indigo, violet, puce","Behavior; green, pink, blue","","Sleep; indigo, violet, puce","Behavior; green, pink, blue,Sleep; indigo, violet, puce") df <- data.frame(id_num,question) # 用正则分隔符拆分 result <- cSplit_e(data=df, split.col="question", sep=",(?!\\s)", type="character", fixed=FALSE) # 查看结果 print(result)
运行后,拆分出的列就是你想要的:
question_Behavior; green, pink, bluequestion_Sleep; indigo, violet, puce
空值和单一选项的条目也会对应生成正确的列。
方法二:先替换分隔符再拆分(兼容老版本)
要是你的splitstackshape版本对正则支持不太好,可以先把目标分隔符换成一个唯一标识,再拆分:
library(splitstackshape) # 预处理:把",后面跟非空格"的地方换成自定义分隔符"@@@" df$question <- gsub(",(\\S)", "@@@\\1", df$question, perl=TRUE) # 用自定义分隔符拆分 result <- cSplit_e(data=df, split.col="question", sep="@@@", type="character") # 查看结果 print(result)
这个方法效果和方法一一样,就是多了一步替换操作。
注意事项
- 尽量装最新版的
splitstackshape包,避免正则兼容问题; - 空字符串的条目会生成对应列,值为
FALSE(因为没匹配到任何选项)。
内容的提问来源于stack exchange,提问作者Catherine
相关产品推荐
相关产品推荐

