【问题标题】:How to get the trios repeated by rows in R?如何让三重奏在R中按行重复?
【发布时间】:2021-03-02 22:54:03
【问题描述】:

如何获得按行重复值的列?如果我有以下数据集:

    DOC      A                B                C               D
 1 Doc1    apple            berry            coconut          pear 
 2 Doc2    apple            banana           berry            prune
 3 Doc3    apple            banana           berry            coconut
 4 Doc4    banana           berry            pear             prune

所需的子集输出将是:

  DOC           Trio                     A             B           C           D

1 Doc1     apple, berry, coconut      apple         berry        coconut     pear
2 Doc3     apple, berry, coconut      apple         banana       berry       coconut

3 Doc2     apple, banana, berry       apple         banana       berry       prune
4 Doc3     apple, banana, berry       apple         banana       berry       coconut

5 Doc2     banana, berry, prune       apple         banana       berry       prune
6 Doc4     banana, berry, prune       banana        berry        pear        prune

这个想法是在同一行中获取所有可能的三重奏,并在其他行中重复。

提前致谢!

【问题讨论】:

  • 我无法按照逻辑得到想要的输出,你能把规则解释清楚一点吗?
  • 所以,我们的想法是能够在每个文档中识别在另一个文档中重复的三个关键字,然后将它们(重复的关键字)一起粘贴到这些文档中。

标签: r dataframe


【解决方案1】:

这可以解决问题。

text="
Doc     A               B            C            D
Doc1    apple            berry            coconut          pear 
Doc2    apple            banana           berry            prune
Doc3    apple            banana           berry            coconut
Doc4    banana           berry            pear             prune"
library(stringr)
library(dplyr)
df=read.table(text=text, header=TRUE, stringsAsFactors = FALSE)
df1=data.frame(DOC=c(), Trio=c(), A=c(), B=c(), C=c(), D=c())
for (i in 1:(nrow(df)-1)) {
  for (j in (i+1):nrow(df)) {
    com1=combn(df[i,2:5], 3)
    com2=combn(df[j,2:5], 3)
    for (k in 1:ncol(com1)) {
      for (h in 1:ncol(com2)) {
        if (setequal(com1[,k], com2[,h])) {
          trio=str_c(com1[1,k], ", ", com1[2,k], ", ", com1[3,k])
          df2=mutate(df[i,], Trio=trio)
          df3=mutate(df[j,], Trio=trio)
          df1=bind_rows(df1, df2, df3)
        }
      }
    }
  }
}
df1=relocate(df1, Trio, .after=Doc)

   Doc                  Trio      A      B       C       D
1 Doc1 apple, berry, coconut  apple  berry coconut    pear
2 Doc3 apple, berry, coconut  apple banana   berry coconut
3 Doc2  apple, banana, berry  apple banana   berry   prune
4 Doc3  apple, banana, berry  apple banana   berry coconut
5 Doc2  banana, berry, prune  apple banana   berry   prune
6 Doc4  banana, berry, prune banana  berry    pear   prune

【讨论】:

    【解决方案2】:

    这是替代的基本 R 方法。您可以先确定“DOC”的所有组合。然后,在循环中将“DOC”的每个组合与intersect 进行比较,看看是否有 3 个共同元素。如果是这样,请将这些行存储在一个列表中,并包括三个已识别的常见元素。如果您想避免重复行(如果这是一个考虑因素),可能需要进一步处理。

    combos <- combn(df$DOC, 2)
    idx <- 1
    lst <- list()
    for (i in 1:ncol(combos)) {
      r1 <- df[df$DOC == combos[1, i], ]
      r2 <- df[df$DOC == combos[2, i], ]
      j <- intersect(unlist(r1)[-1], unlist(r2)[-1])
      if (length(j) == 3) {
        lst[[idx]] <- data.frame(rbind(r1, r2), trio = toString(j))
        idx <- idx + 1
      }
    }
    do.call(rbind, lst)
    

    输出

        DOC      A      B       C       D                  trio
    1  Doc1  apple  berry coconut    pear apple, berry, coconut
    3  Doc3  apple banana   berry coconut apple, berry, coconut
    2  Doc2  apple banana   berry   prune  apple, banana, berry
    31 Doc3  apple banana   berry coconut  apple, banana, berry
    21 Doc2  apple banana   berry   prune  banana, berry, prune
    4  Doc4 banana  berry    pear   prune  banana, berry, prune
    

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      相关资源
      最近更新 更多