识别和交换变量中两个值的更好方法

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

我正在寻找一种更有效的方法来交换变量中的两个值。在数据框中,每个受访者都有一个独特的

id

set.seed(1234)

test <- data.frame(
  id = sample(1:10),
  value = 21:30
)

test
   id value
1  10    21
2   6    22
3   5    23
4   4    24
5   1    25
6   8    26
7   2    27
8   7    28
9   9    29
10  3    30

假设

id
6 和 3 放错位置; 6 应在第 10 行,3 应在第 2 行。

注意id的顺序不是固定的。 (这里的种子仅用于复制。) 我总是使用临时 ID 来解决这个问题。

test$id[test$id == 6] <- 999 # Not a real id
test$id[test$id == 3] <- 6
test$id[test$id == 999] <- 3

   id value
1  10    21
2   3    22
3   5    23
4   4    24
5   1    25
6   8    26
7   2    27
8   7    28
9   9    29
10  6    30

我知道

match
grep
也可以做到这一点。

pos_six <- match(6, test$id)
test$id[match(3, test$id)] <- 6
test$id[pos_six] <- 3

   id value
1  10    21
2   3    22
3   5    23
4   4    24
5   1    25
6   8    26
7   2    27
8   7    28
9   9    29
10  6    30

这并不具有挑战性。然而,我仍然有兴趣探索不同的、更优雅的方法。

r dataframe
1个回答
0
投票

您可以与

foo[x, y] <- foo[y, x]
交换值,例如

test <- data.frame(id = 1:10, value = 21:30)
idx <- match(c(3, 6), test$id); 
within(test, id[idx] <- id[rev(idx)])
#>    id value
#> 1   1    21
#> 2   2    22
#> 3   6    23
#> 4   4    24
#> 5   5    25
#> 6   3    26
#> 7   7    27
#> 8   8    28
#> 9   9    29
#> 10 10    30
© www.soinside.com 2019 - 2024. All rights reserved.