使用 R 查找在选择列中重复值的行

问题描述 投票:0回答:1

长期潜伏在堆栈溢出中,但现在决定测试一下,看看这里是否有人可以帮助我解决困扰我很长一段时间的数据清理问题。我有数据记录了受试者(在数据集中用“id”表示)注意到某些刺激的顺序,其中列代表单个刺激,值 1-4 表示注意到刺激的顺序。零表示未被注意到的刺激,我对具有多个零的行不感兴趣,因此它们也可以重新编码为 NA。这是一个示例数据集:

df <- data.frame(id=c('A', 'B', 'C', 'D', 'E', 'F'),
                 stim1=c(1, 0, 1, 1, 0, 1),
                 stim2=c(2, 2, 2, 2, 2, 2),
                 stim3=c(0, 1, 2, 3, 1, 2),
                 stim4=c(0, 3, 4, 0, 0, 4))

df
  id stim1 stim2 stim3 stim4
1  A     1     2     0     0
2  B     0     2     1     3
3  C     1     2     2     4
4  D     1     2     3     0
5  E     0     2     1     0
6  F     1     2     2     4

现在,如您所见,受试者 C 和 F 在两种不同刺激下的值为 2。我想要做的是找到所有列 stim1 到 stim4 中存在重复值 1 到 4 的所有行。目标是找到存在此类问题数据的 ID 和刺激,以便我可以从相应受试者的原始数据中验证这是否只是数据输入中的拼写错误(例如,2 之一应该是 3),并在之前纠正它继续使用数据做其他事情。

我想对此有一些优雅的 dplyr 解决方案(按行排列?),但即使进行了相当多的谷歌搜索,我也找不到任何适合这个问题的东西。

理想的解决方案是打印 ID 和重复的值,如示例数据框中所示:

C 2
F 2

但是,即使获取存在重复值的 ID 也会很有帮助,因为如果应用此类过滤,数据集并不会太大,无法手动检查重复项。

许多潜在的解决方案通过提供适合查找完全重复的行的东西(这不是问题)而让我犹豫不决。我还尝试转置数据帧,然后使用通用重复函数,但没有设法做一些非常合适的事情。

我认为这是一个类似的查询,我尝试过的解决方案:

如何识别数据框中具有相同值的列?

df <- data.frame(id=c('A', 'B', 'C', 'D', 'E', 'F'),
                 stim1=c(1, 0, 1, 1, 0, 1),
                 stim2=c(2, 2, 2, 2, 2, 2),
                 stim3=c(0, 1, 2, 3, 1, 2),
                 stim4=c(0, 3, 4, 0, 0, 4))

df

  id stim1 stim2 stim3 stim4
1  A     1     2     0     0
2  B     0     2     1     3
3  C     1     2     2     4
4  D     1     2     3     0
5  E     0     2     1     0
6  F     1     2     2     4

df <- df[, duplicated(t(df)) | duplicated(t(df), fromLast = TRUE)]
df <- df[order(df[1])]
Error in `[.data.frame`(df, 1) : undefined columns selected

这只是我尝试过的许多解决方案之一,这些解决方案返回错误或给我一个空对象,所以一定是我做错了什么。

duplicates row data-cleaning
1个回答
0
投票

您可以将向量连接起来,例如:

x <- apply(df[,2:ncol(df)], 1, function(x) paste0(x, collapse=""))

随后:

bitwOr(as.numeric(duplicated(x, fromLast=T)), as.numeric(duplicated(x,fromLast=F)))

这将确保任何重复值从第一次出现到最后一次出现的匹配。

输出:

0 0 1 0 0 1
© www.soinside.com 2019 - 2024. All rights reserved.