【问题标题】:Subset by row and column reciprocity [duplicate]按行和列互惠的子集[重复]
【发布时间】:2018-02-13 23:09:30
【问题描述】:

我无法根据行和列中值的互易性对 data.frame 进行子集化。

这里有一个例子 df 来说明问题:

rater <- c(21, 23, 26, 24)
ratee <- c(24, 21, 23, 21)
rating.data <- data.frame(rater, ratee)

输出:

   rater ratee
1    21    24
2    23    21
3    26    23
4    24    21

我想通过只保留具有倒数的行来子集这个 df。

生成的子集应如下所示:

   rater ratee
1    21    24
4    24    21

任何想法将不胜感激!

【问题讨论】:

  • 你用错了互惠这个词。 1/x 是 x 的倒数。
  • 你想得到一个对称矩阵吗???
  • 我有一个使用 igraph 包的矩阵,一个邻接矩阵。该软件包只能提供倒数的比率。我正在使用他们用于网络分析的语言。

标签: r duplicates


【解决方案1】:

我们可以按行排序,然后使用duplicated

m1 <- t(apply(rating.data, 1, sort))
rating.data[duplicated(m1)|duplicated(m1, fromLast = TRUE),]
#   rater ratee
#1    21    24
#4    24    21

【讨论】:

  • 这太棒了!我一直在想如何使用重复的问题。这很好用!谢谢!
  • @SeekingData 如果这个答案对你有帮助,你可以接受它:)
  • 我希望我能接受两者。谢谢你,阿克伦!
【解决方案2】:

另一种可能性:

library(dplyr)
rating.data %>% inner_join(.,.,by=c("rater" = "ratee","ratee"="rater"))

或者这个,由于某种原因,它在你的小例子中要快两倍(虽然比 akrun 的解决方案慢):

merge(rating.data,setNames(rating.data,rev(names(rating.data))))

通过您的附加列保持第二种解决方案的灵活性:

merge(rating.data,setNames(rating.data[,c("rater","ratee")],c("ratee","rater")))

【讨论】:

  • 谢谢!这实际上是我一直在寻找的,因为我不想松开 df 的其余部分。这使我可以指定我想到的列。感谢您阅读我的想法!
  • 不客气,akrun 的解决方案很容易适应,但如果您只是将rating.data[,c("rater","ratee")] 放在第一行,如果担心的话,它可能也会更快。
【解决方案3】:
library(data.table)
N=10#number of rows 
dt1<-data.table(a=1:N,b=sample(N))#create the data.table that holds the info

dt1[,d:=ifelse(a<b,paste0(a,"_",b),paste0(b,"_",a))]#create unique key per pair  respecting the rule "min_max"
setkey(dt1,d)#setting the key 
dt1[dt1[,.N,d][N!=1],.(a,b)] #keep only the pairs that appear more than once

【讨论】:

    【解决方案4】:

    在本质上类似于 akrun 的方法,rbind 将 data.frame 复制到列颠倒的副本。从底部开始查找重复项,然后将为原始 data.frame 中的行返回 TRUE。使用[seq_len(nrow(rating.data))] 对该逻辑向量进行子集化,以将适当长度的向量返回给[,以便对行进行子集化。

    rating.data[duplicated(rbind(rating.data,
                                 unname(unclass(rating.data[2:1]))),
                           fromLast=TRUE)[seq_len(nrow(rating.data))],]
      rater ratee
    1    21    24
    4    24    21
    

    【讨论】:

      【解决方案5】:

      您还可以使用pminpmax 协助进行分组,然后过滤具有多个条目的所有组,即

      library(dplyr)
      
      df %>% 
       group_by(grp = paste0(pmin(rater, ratee), pmax(rater, ratee))) %>% 
       filter(n() > 1) %>% 
       ungroup() %>% 
       select(-grp)
      

      给出,

      # A tibble: 2 x 2
        rater ratee
        <dbl> <dbl>
      1    21    24
      2    24    21
      

      【讨论】:

      • 我想到了pmin/pmax 方法。会更快
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2016-02-21
      相关资源
      最近更新 更多