【问题标题】:Unique Data Frame by Prioritize Value in RR中按优先级值排列的唯一数据框
【发布时间】:2018-08-14 10:10:42
【问题描述】:

我在 R 中有以下数据框:

A<-c(1,0,0,1,0)
B<-c("A","A","B","B","C")
df<-cbind(A,B)

我想通过优先考虑 A 列中的值来唯一这个数据框。 优先考虑值 1 而不是值 0。

我尝试编写如下代码:

uniq<-unique(subset(df, df[,1]==1))

结果:

      A   B  
[1,] "1" "A"
[2,] "1" "B"

但我想要:

      A   B
[1,] "1" "A"
[2,] "1" "B"
[3,] "0" "C"

我怎样才能做到这一点?谢谢之前

【问题讨论】:

  • 其他 0 行在哪里?
  • 在 A 列上。我尝试写 uniq

标签: r unique subset


【解决方案1】:

首先你的df实际上是一个矩阵,所以你可以从df &lt;- data.frame(df, stringsAsFactors = FALSE)开始

然后排序,使 A == 1 先出现,最后清除重复项

df <- df[order(df[["A"]], decreasing = TRUE), ]
df[!duplicated(df[["B"]]), ]
  A B
1 1 A
4 1 B
5 0 C

【讨论】:

    【解决方案2】:

    你可以使用aggregate,如果你确定你有一个数据框而不是一个矩阵:

    df<-data.frame(A,B, stringsAsFactor = FALSE)    
    aggregate(A ~ B, df,  max)
    #   B A
    # 1 A 1
    # 2 B 1
    # 3 C 0
    

    如果你想优先考虑一个值并且简单的排序还不够好(因为你想优先考虑一个字符或因子值,或者一个不是最小值/最大值的数值,或者你想离开其他的顺序值不变),您可以使用:

    df2 <- df[order(df$A!=1),]
    df2 <- df2[!duplicated(df2[["B"]]), ]
    

    这与@snoram 的回答略有不同

    【讨论】:

    • data.frame 并没有完全清理混乱,因为在这种情况下,B 列成为一个因素(OP 可能不关心或想要这种方式,但最好注意它):)
    【解决方案3】:

    首先按第一列(降序)对数据进行排序,然后删除第二列重复值的行。

    df <- df[order(df[,1], decreasing = T),]
    df[duplicated(df[,2])==F,]
    
         A   B  
    [1,] "1" "A"
    [2,] "1" "B"
    [3,] "0" "C"
    

    【讨论】:

      【解决方案4】:

      我认为借助数据表您将能够做到这一点

      A<-c(1,0,0,1,0)
      B<-c("A","A","B","B","C")
      df<-as.data.frame(as.character(cbind(A,B)))
      
      df1<- dplyr::arrange(df,desc(A),B)
      
      library(data.table)
      DT <- data.table(df1)
      setkey(DT, B)
      
      d<- DT[J(unique(B)), mult = "last"]
      

      【讨论】:

        【解决方案5】:

        tidyverse 解决方案

        library(tidyverse)
        df %>% as.data.frame( stringsAsFactors = FALSE ) %>% 
          arrange( B, desc(A) ) %>%
          filter( !duplicated(B) )
        
        #   A B
        # 1 1 A
        # 2 1 B
        # 3 0 C
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-07
          • 1970-01-01
          • 2020-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多