我正在寻找一种更有效的方法来交换变量中的两个值。在数据框中,每个受访者都有一个独特的
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
这并不具有挑战性。然而,我仍然有兴趣探索不同的、更优雅的方法。
您可以与
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