【发布时间】:2020-03-17 23:08:40
【问题描述】:
如何使用 R 查找在一行中是否存在重复项?
附件是主管报告层次结构的示例。一行中不应该有重复的数字,因为每个人都不能向层次结构中的某个人汇报。
在示例图像中,第 2 行有两个 6,第 3 行有两个 10,所以我想创建一个“重复”列,指示重复的“Y”。欢迎任何其他建议。
“for 循环(for i in 1:nrow)”或“应用”是更好的选择吗?
【问题讨论】:
标签: r duplicates
如何使用 R 查找在一行中是否存在重复项?
附件是主管报告层次结构的示例。一行中不应该有重复的数字,因为每个人都不能向层次结构中的某个人汇报。
在示例图像中,第 2 行有两个 6,第 3 行有两个 10,所以我想创建一个“重复”列,指示重复的“Y”。欢迎任何其他建议。
“for 循环(for i in 1:nrow)”或“应用”是更好的选择吗?
【问题讨论】:
标签: r duplicates
您可以使用ifelse() 制作专栏
data$duplicate <- ifelse(apply(data, 1, function(row) any(duplicated(row))), "Y", "N")
【讨论】:
另一个基本 R 选项
df$dup <- ifelse(rowSums(do.call(rbind,Map(duplicated,data.frame(t(df)))))>0,"Y","N")
这样
> df
sup1 sup2 sup3 sup4 sup5 dup
1 1 2 3 4 20 N
2 5 6 6 8 22 Y
3 9 10 11 10 11 Y
4 13 14 15 16 13 Y
数据
df <- data.frame(sup1 = c(1,5,9,13),
sup2 = c(2,6,10,14),
sup3 = c(3,6,11,15),
sup4 = c(4,8,10,16),
sup5 = c(20,22,11,13))
【讨论】:
我们可以通过循环遍历行来检查duplicated,得到一个逻辑向量作为输出,并在转换为二进制后将其更改为“N”、“Y”
df1$duplicate <- c("N", "Y")[1+ (
apply(df1, 1, function(x) any(duplicated(x))))]
df1$duplicate
#[1] "N" "Y" "Y" "Y"
或者它可以更紧凑
df1$duplicate <- c("N", "Y")[1+(apply(df1, 1, anyDuplicated)>0)]
df1 <- data.frame(Sup1 = c(1, 5, 9, 13), Sup2 = c(2, 6, 10, 14),
Sup3 = c(3, 6, 11, 15), Sup4 = c(4, 8, 10, 16), Sup5 = c(20, 22, 11, 13))
【讨论】:
我们可以使用table 来计算每行中出现的次数,如果任何值重复,则返回"Y"。
df$duplicate <- c("N", "Y")[apply(df, 1, function(x) any(table(x) > 1)) + 1]
df
# Sup1 Sup2 Sup3 Sup4 Sup5 duplicate
#1 1 2 3 4 20 N
#2 5 6 6 8 22 Y
#3 9 10 11 10 11 Y
#4 13 14 15 16 13 Y
【讨论】:
apply 的输出是一个逻辑向量 (TRUE/FALSE)。我们使用 +1 将其分别更改为 2 和 1,然后将其用于子集 "N" 和 "Y"。