我有一个包含两列的数据框:
VAR1. VAR2.
A. 102 million; 102 million
B. 0.1 million; 2 million; 0.1 million; 2 million
我想删除 VAR2 的重复值。对于每一行,获得
VAR1. VAR2.
A. 102 million
B. 0.1 million; 2 million
我该怎么办?
谢谢你的建议
使用基数 R,我们可以将 ";"
和 paste
unique
条目上的字符串拆分为 VAR2
sapply(strsplit(df$VAR2, ";"), function(x) paste(unique(x), collapse = ";"))
#[1] "102 million" "0.1 million;2 million"
使用 dplyr
和 tidyr
我们可以使用 separate_rows
将 VAR2
带入不同的行,然后 paste
每组只有 unique
个条目。
library(dplyr)
library(tidyr)
df %>%
separate_rows(VAR2, sep = ";") %>%
group_by(VAR1) %>%
summarise(VAR2 = paste(unique(VAR2), collapse = ";"))
# VAR1 VAR2
# <fct> <chr>
#1 A 102 million
#2 B 0.1 million;2 million
这是一个使用 sub
的解决方案,它似乎有效:
x <- "0.1 million; 2 million; 0.1 million; 2 million"
gsub("\\b(\\d+(?:\\.\\d+)?) ([^;]+); (?=.*\\b\\1 \\2\\b)", "", x, perl=TRUE)
[1] "0.1 million; 2 million"
这里使用的一般策略是匹配一个数字,带有一个可选的小数部分,后跟另一个词,前提是这个数字词项在输入字符串的下游至少出现一次。如果它确实再次出现,那么我们通过用空字符串替换来删除第一个术语。请注意,一对术语的最后一次出现不会被删除,因为积极的前瞻会失败。