我有以下数据集
df <- data.frame(
path = c("a,b,a",
"(direct) / (none), (direct) / (none), google / cpc, google / cpc",
"f,d",
"a,c"
)
)
我希望删除重复的内容,以便输出
path
1: a, b
2: (direct) / (none), google / cpc
3: f, d
4: a, c
我尝试了这个,但它不适用于第二行
setDT(df)
df$path <- sapply(strsplit(as.character(df$path ), split=","), function(x) {
paste(unique(x), collapse = ', ')
})
答案 0 :(得分:4)
你快到了。唯一的问题是您需要使用",\\s*"
而不是","
进行拆分。在后一种情况下,调用unique
不会产生所需的输出,因为某些字符串可能因空格数而不同。如果在拆分时将其删除,则可以解决此问题。
另一方面,由于您使用了setDT(df)
,我猜您使用的是data.table
。如果是这样,您需要使用正确的data.table
语法来避免副本:
df[,path:=sapply(
strsplit(as.character(df$path ), split=",\\s*"),
function(x) {paste(unique(x), collapse = ', ')})]
将通过引用修改path
列。
答案 1 :(得分:2)
看起来你的问题是第二个字符串中的初始空格。你想保留它,还是你愿意失去它?如果你愿意失去它,那么
df$path <- sapply(strsplit(as.character(df$path), split=","), function(x) {
paste(unique(trimws(x)), collapse = ', ') } )
是你想要的:
> df$path <- sapply(strsplit(as.character(df$path), split=","), function(x) {
+ paste(unique(trimws(x)), collapse = ', ') } )
> df$path
[1] "a, b" "(direct) / (none), google / cpc"
[3] "f, d" "a, c"
>
答案 2 :(得分:1)
代码背后的基本逻辑:
i)将每一行分成“,”,(ii)删除空格(iii)取唯一值
(iv)倒退“,”并粘贴
t = apply(df, 1, function(x) paste0(unique(trimws(unlist(strsplit(x,",")))), collapse = ","))
df=data.frame(t)
# df
# t
#1 a,b
#2 (direct) / (none),google / cpc
#3 f,d
#4 a,c