我想我只是看不到它,但我在网上发现的所有类似内容,邮件列表档案或常见问题解答都无法真正阐明我的问题。
我发现的最接近的是: apply strsplit rowwise
我有一个df,有两个字符列和一个数字列。 填写如下:
df=data.frame(name1=c("A","B","C","D"),
name2=c("B","A","D","C"),
nums=c(1,1,4,4),
stringsAsFactors=F)
现在我想在此找到唯一的行,但是,仅基于两个名称列。对于那些列,列的顺序没有意义,因此如果我理解正确,我就不能使用duplicated
。
所以我考虑将两个名称列逐行组合,进行逐行排序,并打印出向量的paste
(长度= 2并结合sapply
)。
但是我没有让它发挥作用。
到目前为止,我使用了for循环,但这需要在原始数据上花费很长时间。
for(i in 1:length(df$name1)){
mysort=sort(c(df$name1[i],df$name2[i]))
df$combname[i]=paste(mysort[1],mysort[2])
}
欢迎任何建议。也许我只是以错误的方式理解unique
和sapply
。
答案 0 :(得分:1)
也许您应该探索“data.table”包。这是一种方法:
library(data.table)
DT <- data.table(df)
DT[, new := paste(sort(c(name1, name2)), collapse = ""), by = 1:nrow(DT)]
DT
# name1 name2 nums new
# 1: A B 1 AB
# 2: B A 1 AB
# 3: C D 4 CD
# 4: D C 4 CD
DT[!duplicated(new), ]
# name1 name2 nums new
# 1: A B 1 AB
# 2: C D 4 CD
答案 1 :(得分:1)
没有for循环的解决方案。
df$combname <- apply(df[1:2], 1, function(x) paste(sort(x), collapse=""))