> dummy <- data.frame(X = c(1, 2, 3, 4, 5, 5, 2, 6, 7, 2), Y = c(3, 2, 1, 4, 5, 6, 7, 3, 4, 2))
> dummy
X Y
1 1 3
2 2 2
3 3 1
4 4 4
5 5 5
6 5 6
7 2 7
8 6 3
9 7 4
10 2 2
我有一个data.frame,由1到7的值组成。我想将1改为7(反之亦然),2改为6(反之亦然),3's改为5's(反之亦然),并且4'将保持为4。即基本上我想“反转”数字。我想过编写一个for循环来迭代每一列中的每个值并使用ifelse
语句,但是我怎么能同时改变7'到1和1到7?
答案 0 :(得分:10)
考虑到要切换的所有数字对的总和为8,您可以从8
中减去原始数据框,并且应该根据需要恢复所有值,这样您就可以{{ 1}}:
8 - dummy
答案 1 :(得分:3)
match
是正确的泛型方法 - 即使你找不到一个简单的数学运算,它也会起作用:
首先设置key
和value
向量,其中key
的第i个条目要替换为value
的相应条目:
key = 1:7 # key to look up (current value)
value = 7:1 # desired value corresponding to key
dummy$newX = value[match(dummy$X, key)]
dummy$newY = value[match(dummy$Y, key)]
# X Y newX newY
# 1 1 3 7 5
# 2 2 2 6 6
# 3 3 1 5 7
# 4 4 4 4 4
# 5 5 5 3 3
# 6 5 6 3 2
# 7 2 7 6 1
# 8 6 3 2 5
# 9 7 4 1 4
# 10 2 2 6 6
当然,您可以直接覆盖X
和Y
- 我会将它们留在这里以证明它有效。
答案 2 :(得分:2)
更加通用:
max(dummy) + min(dummy) - dummy
X Y
1 7 5
2 6 6
3 5 7
4 4 4
5 3 3
6 3 2
7 6 1
8 2 5
9 1 4
10 6 6