首页 > 解决方案 > 如何获得“|”的不同值 分隔列?

问题描述

我有一个看起来像这样的数据框:

+--+---------------------------+
|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

解决方案


这是一个基于 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),它匹配任何管道分隔的术语,我们稍后可以在网格字符串中找到相同的术语。如果是这样,那么我们通过替换为空字符串来剥离它。还有一些清理步骤可以删除可能留下的悬垂多个管道(或在网格字符串的开头/结尾处)。


推荐阅读