【问题标题】:Remove almost identical data frame rows by condition in R按 R 中的条件删除几乎相同的数据框行
【发布时间】:2019-04-07 18:39:54
【问题描述】:

我有一个包含许多几乎相同行的数据框。我需要编写一个代码,允许在一对(或 3 或 4 组)行中选择其中一个行,这些行在名称、姓氏、V1 和 P1 上相似但在 V2 和 P2 上不同,然后删除不需要的行。需要维护的行将由以下条件指定:如果 P1 = P2,则必须保留该行,如果 P1 P2,则应保留 P2 最大的行.

id   Name  Surname     V1         P1       V2        P2
15  John    Smith     0.80        4       0.75        2    
16  John    Smith     0.80        4       1.00        3    
17  John    Smith     0.80        5       0.75        2    
18  John    Smith     0.80        5       1.00        3    
19  John    Smith     0.75        2       0.75        2    
20  John    Smith     0.75        2       1.00        3   

我期望的输出如下所示:

id  Name  Surname     V1          P1       V2        P2
16  John    Smith     0.80        4       1.00        3    
18  John    Smith     0.80        5       1.00        3    
19  John    Smith     0.75        2       0.75        2    

有什么简单的方法吗?

扩展数据集

id    Name Surname V1     P1    V2      P2
194   Lisa  Paul   0,1    1     0,2      1
195   Lisa  Paul   0,1    1     0,4      5
196   Lisa  Paul   0,1    4     0,5      1
197   Lisa  Paul   0,1    4     0,1      5
198   Lisa  Paul   0,1    2     0,1      1
199   Lisa  Paul   0,1    2     0,4      5
201   Lisa  Paul   0,1    3     0,2      1
202   Lisa  Paul   0,1    3     0,1      5
203   Lisa  Paul   0,1    5     0,3      1
204   Lisa  Paul   0,1    5     0,2      5
205   Lisa  Paul   0,1    6     0,2      1
206   Lisa  Paul   0,1    6     0,1      5

【问题讨论】:

  • 虽然您在 P1 和 P2 上的条件很清楚,但其余的则不是。据说名字和姓氏必须相同。 V1 和 V2 到底怎么样?
  • 嗨!谢谢你的评论。我跳过了这个信息,因为这对是由 P1 确定的。所以 V1 在每一对中都是相同的。 V2 可能会有所不同。希望对您有所帮助!

标签: r dataframe filter subset


【解决方案1】:

至少对于您的示例数据,以下内容似乎可行:

library(tidyverse)
data %>% group_by(Name, Surname, P1) %>%
  filter(P2 == max(P2[P1 >= P2]))
# A tibble: 6 x 7
# Groups:   Name, Surname, P1 [6]
#      id Name  Surname    V1    P1    V2    P2
#   <int> <fct> <fct>   <dbl> <int> <dbl> <int>
# 1   194 Lisa  Paul      0.1     1   0.2     1
# 2   196 Lisa  Paul      0.1     4   0.5     1
# 3   198 Lisa  Paul      0.1     2   0.1     1
# 4   201 Lisa  Paul      0.1     3   0.2     1
# 5   204 Lisa  Paul      0.1     5   0.2     5
# 6   206 Lisa  Paul      0.1     6   0.1     5

对于每个唯一的姓名、姓氏和 P1 组,我保留那些不大于相应 P1 的所有 P2 中最大 P2 的行。

【讨论】:

  • @KateTol,它回答了你的问题吗?
  • 朱利叶斯,非常感谢您的回答!有用。但是当应用于扩展数据集(我将其添加到原始帖子中)时,它只留下周期 1、5 和 6 的行。虽然周期 2、3、4 也需要保留在数据中。可以用它做什么?提前致谢!
  • @KateTol,但是当 P1 为 2 时,则在这两种情况下 P1
  • 感谢您的评论。我认为问题可能是当 P1 等于 2、3 和 4 时,它们在一种情况下都大于 P2,而在第二种情况下则更小。因此,例如,当 R 必须取最大数(最大 P2)时,结果行包含 P1 P1 它必须以某种方式获取不 > 1 的 max (P2) 行。
  • @KateTol,啊,对,我知道我错了。也许现在看起来不错?
猜你喜欢
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2022-08-21
相关资源
最近更新 更多