我在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 :(得分: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