R:从表中删除双向命中

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中针对每个唯一V1的一些双向点击。我想删除每个双向命中(随机选择)中的一个

结果表应如下所示:

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