【问题标题】:R Removing duplicate entries in dataframe and keeping rows with fewer NAs and zeroesR删除数据框中的重复条目并保留具有较少NA和零的行
【发布时间】:2014-11-24 22:05:23
【问题描述】:

我想对我从另一个生成的 data.frame 进行重复数据删除 我的代码库的一部分,无法知道 列和行。 data.frame 有一些我想比较的列 对于重复,这里AB,但我想然后选择 保留在其他行中包含较少 NA 和零的行 数据框中的列,此处为 CDE

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,但是由于我无法控制 我的数据框所在的列和行,我需要一种方法来获取 具有较少 NA 和零的唯一值。

这将在示例中起作用,但如果传入的 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

有什么想法吗?

【问题讨论】:

  • 你知道列名,只是不知道顺序吗?

标签: r


【解决方案1】:

这是一种基于计算有效值并重新排序数据框的方法。

首先,计算CDE 列中的NAs 和0s。

rs <- rowSums(is.na(df[c("C", "D", "E")]) | !df[c("C", "D", "E")])
# [1] 3 0 0 0 3

其次,按AB和新变量对数据框排序:

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

【讨论】:

  • (+1) 有趣的是!df[c("C", "D", "E")] 只识别零,我很难理解为什么。似乎 R 将所有 !=0 转换为 TRUE==0 转换为 FALSE
  • @DavidArenburg 一点点 RT*M 会有所帮助:?as.logical 将明确什么被视为 TRUE ,并且一如既往地注意 NULLNA 值。例如as.logical(NA) #NA
  • 只是好奇这个问题是否有 tidyverse 更新?
猜你喜欢
  • 2016-01-07
  • 2017-01-10
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
相关资源
最近更新 更多