1

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

我发现的最接近的是: 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向量的 a (长度 = 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错误的方式。

4

2 回答 2

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
于 2013-09-28T04:24:59.850 回答
1

没有for循环的解决方案。

df$combname <- apply(df[1:2], 1, function(x) paste(sort(x), collapse=""))
于 2013-09-28T06:04:22.180 回答