我想重复删除我从另一个生成的data.frame
我的代码库的一部分,没有能力知道的顺序
列和行。 data.frame有一些我想要比较的列
复制,A
和B
,但我想选择
要保留其他包含较少NAs和零的行
数据框中的列,C
,D
和E
。
tc=
'Id B A C D E
1 62 12 0 NA NA
2 12 62 1 1 1
3 2 62 1 1 1
4 62 12 1 1 1
5 55 23 0 0 0 '
df =read.table(textConnection(tc),header=T)
我可以使用duplicated
,但因为我无法控制的顺序
我的数据帧到来的列和行,我需要一种方法来获取
具有较少NAs和零的唯一值。
这将在示例中起作用,但如果传入的data.frame则不会 有不同的顺序:
df[!duplicated(data.frame(A=df$A,B=df$B),fromLast=TRUE),]
Id B A C D E
2 2 12 62 1 1 1
3 3 2 62 1 1 1
4 4 62 12 1 1 1
5 5 55 23 0 0 0
有什么想法吗?
答案 0 :(得分:4)
这是一种基于计算有效值和重新排序数据框的方法。
首先,计算NA
,0
和C
列中的D
和E
。
rs <- rowSums(is.na(df[c("C", "D", "E")]) | !df[c("C", "D", "E")])
# [1] 3 0 0 0 3
其次,按A
,B
和新变量排序数据框:
df_ordered <- df[order(df$A, df$B, rs), ]
# Id B A C D E
# 4 4 62 12 1 1 1
# 1 1 62 12 0 NA NA
# 5 5 55 23 0 0 0
# 3 3 2 62 1 1 1
# 2 2 12 62 1 1 1
现在,您可以删除重复的行并保持行的有效值最多。
df_ordered[!duplicated(df_ordered[c("A", "B")]), ]
# Id B A C D E
# 2 2 12 62 1 1 1
# 3 3 2 62 1 1 1
# 4 4 62 12 1 1 1
# 5 5 55 23 0 0 0