【问题标题】:Keep non duplicated values from a row in R保留R中一行的非重复值
【发布时间】:2020-04-08 22:15:34
【问题描述】:

我正在寻找在 Stackoverflow 上找不到的解决方案。 我有一个包含数百万行的数据框,如下所示:

+----------------------+----------------------------------+-----------+-----------+-----------+----------
|       session        |            session_b             |     A     |     B     |     C     |     D     |  
+----------------------+----------------------------------+-----------+-----------+-----------+----------
| 162f2f8f7c5x8f6de8f8 | e5c44c77b9cae93afa9457e535c81451 | 588238268 | 587606411 | 581149505 | 581149505 |  
| 162f2f8f7c5x8f6de8f8 | e5c44c77b9cae93afa9457e535c81451 | 591266911 | 591257117 | 568939090 | 587606411 |  
+----------------------+----------------------------------+-----------+-----------+-----------+----------

我的目标是从 A 到 D 检查每一行的重复值。如果有重复值,我想保留非重复值。在上表的结果下方。


+----------------------+----------------------------------+-----------+-----------+---------+--------+---
|       session        |            session_b            |     A     |     B    |     C     |     D     |  
+----------------------+---------------------------------+-----------+----------+-----------+-----------
| 162f2f8f7c5x8f6de8f8 | e5c44c77b9cae93afa9457e535c81451| 588238268 | 587606411|                       |  
| 162f2f8f7c5x8f6de8f8 | e5c44c77b9cae93afa9457e535c81451| 591266911 | 591257117| 568939090 | 587606411 |  
+----------------------+---------------------------------+-----------+----------+-----------+-----------

【问题讨论】:

  • 你需要df1[c('A', 'B', 'C', 'D')] <- t(apply(df1[c('A', 'B', 'C', 'D')], 1, function(x) replace(x, duplicated(x)|duplicated(x, fromLast = TRUE), NA)))
  • 差不多,看第一行,我删除了重复项。您的代码删除了第二次出现。
  • 也许你在编辑之前看过代码
  • 您可以在下面查看我的解决方案,该解决方案完全符合预期输出。在这里,我使用NA 而不是空格
  • 完美! c 之前缺少一个逗号,但它可以正常工作!非常感谢:)。

标签: r


【解决方案1】:

如果我们要替换所有重复项,请逐行使用duplicatedapplyMARGIN = 1

df1[c('A', 'B', 'C', 'D')] <- t(apply(df1[c('A', 'B', 'C', 'D')], 1, 
   function(x) replace(x, duplicated(x)|duplicated(x, fromLast = TRUE), NA)))


df1
#               session                        session_b         A         B         C         D
#1 162f2f8f7c5x8f6de8f8 e5c44c77b9cae93afa9457e535c81451 588238268 587606411        NA        NA
#2 162f2f8f7c5x8f6de8f8 e5c44c77b9cae93afa9457e535c81451 591266911 591257117 568939090 587606411

数据

df1 <- structure(list(session = c("162f2f8f7c5x8f6de8f8", "162f2f8f7c5x8f6de8f8"
), session_b = c("e5c44c77b9cae93afa9457e535c81451", "e5c44c77b9cae93afa9457e535c81451"
), A = c(588238268L, 591266911L), B = c(587606411L, 591257117L
), C = c(581149505L, 568939090L), D = c(581149505L, 587606411L
)), class = "data.frame", row.names = c(NA, -2L))

【讨论】:

  • 为了保存到数据框中,我添加了 as.data.frame,它的工作原理:)。
  • @Michel 和df1[c('A', 'B', 'C', 'D')] &lt;- ,ddata.frame 的属性还在。你不需要as.data.frame
猜你喜欢
  • 2017-08-01
  • 2017-12-29
  • 2021-09-24
  • 1970-01-01
  • 2023-01-10
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
相关资源
最近更新 更多