r - 如何获得“|”的不同值 分隔列?
问题描述
我有一个看起来像这样的数据框:
+--+---------------------------+
|id|grids |
+--+---------------------------+
|c1|21257a|75589y|21257a|77589y|
|c2|21257a|21257a|21257a|21257a|
|c3|21257a|75589y|75589y|33421v|
但是,由于网格列下有重复的字符,我想只提取不同的字符,使数据框变成这样:
+--+---------------------------+
|id|grids |
+--+---------------------------+
|c1|21257a|75589y |
|c2|21257a |
|c3|21257a|75589y|33421v |
任何帮助,将不胜感激!
解决方案
这是一个基于 R 正则表达式的基本方法:
df$grids <- gsub("\\b(.+?)(?=\\|.*\\1)", "", df$grids, perl=TRUE)
df$grids <- gsub("^\\|+|\\|+$", "", df$grids)
df$grids <- gsub("\\|{2,}", "|", df$grids)
df
id grids
1 c1 21257a|75589y
2 c2 21257a
3 c3 21257a|75589y|33421v
数据:
df <- data.frame(id=c("c1", "c2", "c3"),
grids=c("21257a|75589y|21257a|75589y",
"21257a|21257a|21257a|21257a",
"21257a|75589y|75589y|33421v"))
对于 regex 的解释\b(.+?)(?=\|.*\1)
,它匹配任何管道分隔的术语,我们稍后可以在网格字符串中找到相同的术语。如果是这样,那么我们通过替换为空字符串来剥离它。还有一些清理步骤可以删除可能留下的悬垂多个管道(或在网格字符串的开头/结尾处)。
推荐阅读
- javascript - 检测网站内外的导航历史
- javascript - CSV 生成数据格式
- db2 - 按经理的工资累积(DB2 for Oracle CONNECT_BY)
- mysql - Mysql使用if if条件插入查询函数
- php - 如何在 cakePHP 中获取 sql 查询
- java - Cucumber-jvm - 从 TestCaseFinished 事件中检索嵌入图像
- python-3.6 - ElasticSearch 查询未返回预期结果
- java - 数三胞胎 - 第一个方法
- linq - 我如何在实体框架核心中使用模型获取 RowNumber
- php - 在 MySQL 查询的 where 子句中使用数组