通过优先处理R中的值来唯一数据帧

时间:2018-08-14 10:10:43

标签: r unique subset

我在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"

我该如何实现?之前谢谢

5 个答案:

答案 0 :(得分:2)

首先,您的scrollToRow实际上是一个矩阵,因此您可以从func scrollToBottomWithoutAnimation() { DispatchQueue.main.async { if self.dataArray.count > 0 { let indexPath = IndexPath(row: 0, section: 0) notificationTable.scrollToRow(at: indexPath, at: .top, animated: false) } } } 开始

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

func scrollToBottomWithoutAnimation() {
     DispatchQueue.main.async {
         if self.dataArray.count > 0 {
             let indexPath = IndexPath(row: 0, section: 0)
             notificationTable.scrollToRow(at: indexPath, at: .top, animated: true)
         }
     }
}

答案 1 :(得分: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的答案略有不同

答案 2 :(得分:0)

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

scrollView

答案 3 :(得分:0)

我认为借助数据表,您将能够做到

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"]

答案 4 :(得分:0)

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