【问题标题】:Find unique pairs of words ignoring their order in two columns in R在R中的两列中找到唯一的单词对,忽略它们的顺序
【发布时间】:2019-06-24 03:31:57
【问题描述】:

我有一个包含两列重复值的数据框。

   dat<-data.frame(V1 = c("home","cat","fire","sofa","kitchen","sofa"), 
                    V2 = c("cat","home","water","TV","knife","TV"), V3 = c('date1','date1','date2','date3','date4','date3'))

       V1    V2    V3
1    home   cat date1
2     cat  home date1
3    fire water date2
4    sofa    TV date3
5 kitchen knife date4
6    sofa    TV date1

我想从此数据帧中获取唯一对,忽略该对在两列之间出现的顺序。

这将是我想要获得的结果:

       V1    V2    V3
1    home   cat date1
2    fire water date2
3    sofa    TV date3
4 kitchen knife date4

【问题讨论】:

标签: r unique


【解决方案1】:

dat[!duplicated(t(apply(dat, 1, sort))),]

使用applysort 将遍历每一行并进行排序。然后我们可以转置输出并使用duplicated 确定重复项。因为duplicated 返回一个布尔值,所以我们将dat 中的所有行作为子集,其中duplicated = FALSE

【讨论】:

  • 这确实有效。但是,如果我现在想加入结果表,从同一对获得的其他值但保存在另一个数据框中,该怎么办。同样在这种情况下,我需要忽略列的顺序。
  • 你能举个例子吗?
  • 我认为这个问题再问一个问题更合适。stackoverflow.com/questions/54448429/…
【解决方案2】:
library(igraph)
myList = lapply(split(dat, dat$V3), function(x) {  # Split the data by third column
    g1 = graph.data.frame(x, directed = FALSE)  # create undirected graph
    g2 = simplify(g1, remove.multiple = TRUE)  # remove duplicates (same pairs)
    get.edgelist(g2)   #Convert to list of pairs
})

# Add the date back and then combine rows
do.call(rbind, lapply(names(myList), function(nm) data.frame(myList[[nm]], nm)))
#       X1    X2    nm
#1    home   cat date1
#2    fire water date2
#3    sofa    TV date3
#4 kitchen knife date4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2015-04-18
    • 2014-03-04
    • 2019-06-09
    • 2016-02-11
    相关资源
    最近更新 更多