【问题标题】:Match columns with multiple entries in a row and mutate result匹配具有一行中多个条目的列并改变结果
【发布时间】:2018-04-04 13:51:23
【问题描述】:

我有一个数据框:

col_1 <- c("A", "A", "B", "B", "C", "C")
col_2 <- c("A", "B", "C", "D", "E", "F")
col_3 <- c("A", "B", "C", "C", "B", "A")

df <- data.frame(col_1, col_2, col_3)

我想改变一个包含 TRUE 或 FALSE 的新列,具体取决于任何行是否有两个以上相同的条目。

例如:

t_f <- c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE) 

如果我可以有一列包含重复值,那就更好了,例如:

name <- c("A", "B", "C", NA, NA, NA)

【问题讨论】:

  • 标题与帖子不匹配。

标签: r data-manipulation dplyr


【解决方案1】:

你的第一个要求

df$t_f <- apply(df, 1, function(x) any(duplicated(x)))

还有你的第二个

df$name <- apply(df, 1, function(x) ifelse(any(duplicated(x)), x[which(duplicated(x))], NA))

【讨论】:

    【解决方案2】:

    第二个要求:

    col_1 <- c("A", "A", "B", "B", "C", "C")
    col_2 <- c("A", "B", "C", "D", "E", "F")
    col_3 <- c("A", "B", "C", "C", "B", "A")
    
    df <- data.frame(col_1, col_2, col_3)
    
    df$name <- apply(df, 1, 
          function(row)ifelse(max(table(row))>=2, 
                              names(table(row))[which.max(table(row))], NA))
    
    df
    #>   col_1 col_2 col_3 name
    #> 1     A     A     A    A
    #> 2     A     B     B    B
    #> 3     B     C     C    C
    #> 4     B     D     C <NA>
    #> 5     C     E     B <NA>
    #> 6     C     F     A <NA>
    

    【讨论】:

      【解决方案3】:

      在base R中你可以试试

      ifelse(colSums(table(row(df), as.matrix(df)) >= 2) == 1, colnames(table(row(df), as.matrix(df))), NA)
      A   B   C   D   E   F 
      "A" "B" "C"  NA  NA  NA 
      

      在 tidyverse 中你可以做到

      library(tidyverse)
      df %>% 
        mutate_if(is.factor, as.character) %>% 
        rowwise() %>% 
        mutate(dup=anyDuplicated(c(col_1, col_2, col_3))!=0) %>% 
        mutate(which.dup=c(col_1, col_2, col_3)[which(duplicated(c(col_1, col_2, col_3)))[1]])
      Source: local data frame [6 x 5]
      Groups: <by row>
      # A tibble: 6 x 5
        col_1 col_2 col_3 dup   which.dup
        <chr> <chr> <chr> <lgl> <chr>    
      1 A     A     A     TRUE  A        
      2 A     B     B     TRUE  B        
      3 B     C     C     TRUE  C        
      4 B     D     C     FALSE NA       
      5 C     E     B     FALSE NA       
      6 C     F     A     FALSE NA 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        • 1970-01-01
        • 2020-06-28
        • 1970-01-01
        • 2023-03-23
        相关资源
        最近更新 更多