R:从表中删除双向命中
下表包含了V1和V2中针对每个唯一V1的一些双向点击。我想删除每个双向命中(随机选择)中的一个 结果表应如下所示:R:从表中删除双向命中,r,performance,R,Performance,下表包含了V1和V2中针对每个唯一V1的一些双向点击。我想删除每个双向命中(随机选择)中的一个 结果表应如下所示: V1 V2 V3 1 T Y 1 O P 2 E Q 2 V C 2 Y T 这可以使用for循环完成,但我需要一种更有效的方法 在R中执行此操作的最快方法是什么?不确定它是否最快(取决于重复的数量等),但您可以将两个数据副本连接在一起,然后删除重复的副本(中间的一行是随机化行顺序,因此所选的是真正随机的): mirrored我假设随机选择意味着我们选择哪个双
V1 V2 V3
1 T Y
1 O P
2 E Q
2 V C
2 Y T
这可以使用for循环完成,但我需要一种更有效的方法
在R中执行此操作的最快方法是什么?不确定它是否最快(取决于重复的数量等),但您可以将两个数据副本连接在一起,然后删除重复的副本(中间的一行是随机化行顺序,因此所选的是真正随机的):
mirrored我假设随机选择意味着我们选择哪个双向点击并不重要:
df <- read.table(textConnection("V1 V2 V3
1 T Y
1 Y T
1 O P
2 Q E
2 E Q
2 C V
2 V C
2 Y T"), header=TRUE)
rows1 <- apply(df, 1, paste0, collapse="")
## swap the order of column 2,3
rows2 <- apply(df[, c(1, 3:2)], 1, paste0, collapse="")
rows <- rbind(rows1, rows2)
rows
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# rows1 "1TY" "1YT" "1OP" "2QE" "2EQ" "2CV" "2VC" "2YT"
# rows2 "1YT" "1TY" "1PO" "2EQ" "2QE" "2VC" "2CV" "2TY"
vrows <- as.vector(rows)
vrows
# [1] "1TY" "1YT" "1YT" "1TY" "1OP" "1PO" "2QE" "2EQ"
# [9] "2EQ" "2QE" "2CV" "2VC" "2VC" "2CV" "2YT" "2TY"
iunique <- which(!duplicated(vrows))
iunique
# [1] 1 2 5 6 7 8 11 12 15 16
## because of the rbind above we have need only every second entry and
## divide it by 2
i <- iunique[seq(2, length(iunqiue), by=2)]/2
df[i, ]
# V1 V2 V3
# 1 1 T Y
# 3 1 O P
# 4 2 Q E
# 6 2 C V
# 8 2 Y T
df请向我们展示您迄今为止尝试过的代码。“随机”选择是否重要,还是意味着选择哪种双向点击无关紧要?我记得前几天看到过类似的问题。建议在粘贴之前对值进行排序。我认为这也会简化您的代码。您好,这似乎不起作用,最终重复数据消除包含与原始数据帧相同的数据帧
mirrored <- rbind (dframe, dframe[,c(1,3,2)])
mirrored <- mirrored[sample(nrow(mirrored)),]
dedup <- mirrored[!duplicated(mirrored),]
df <- read.table(textConnection("V1 V2 V3
1 T Y
1 Y T
1 O P
2 Q E
2 E Q
2 C V
2 V C
2 Y T"), header=TRUE)
rows1 <- apply(df, 1, paste0, collapse="")
## swap the order of column 2,3
rows2 <- apply(df[, c(1, 3:2)], 1, paste0, collapse="")
rows <- rbind(rows1, rows2)
rows
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# rows1 "1TY" "1YT" "1OP" "2QE" "2EQ" "2CV" "2VC" "2YT"
# rows2 "1YT" "1TY" "1PO" "2EQ" "2QE" "2VC" "2CV" "2TY"
vrows <- as.vector(rows)
vrows
# [1] "1TY" "1YT" "1YT" "1TY" "1OP" "1PO" "2QE" "2EQ"
# [9] "2EQ" "2QE" "2CV" "2VC" "2VC" "2CV" "2YT" "2TY"
iunique <- which(!duplicated(vrows))
iunique
# [1] 1 2 5 6 7 8 11 12 15 16
## because of the rbind above we have need only every second entry and
## divide it by 2
i <- iunique[seq(2, length(iunqiue), by=2)]/2
df[i, ]
# V1 V2 V3
# 1 1 T Y
# 3 1 O P
# 4 2 Q E
# 6 2 C V
# 8 2 Y T