apply-strsplit-rowwise包括排序和嵌套粘贴

时间:2013-09-28 02:50:40

标签: r apply sapply

我想我只是看不到它,但我在网上发现的所有类似内容,邮件列表档案或常见问题解答都无法真正阐明我的问题。

我发现的最接近的是: 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])
    }

欢迎任何建议。也许我只是以错误的方式理解uniquesapply

2 个答案:

答案 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=""))