R:如何更改data.frame中的值

时间:2016-11-10 18:53:40

标签: r dataframe

> 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?

3 个答案:

答案 0 :(得分:10)

考虑到要切换的所有数字对的总和为8,您可以从8中减去原始数据框,并且应该根据需要恢复所有值,这样您就可以{{ 1}}:

8 - dummy

答案 1 :(得分:3)

match是正确的泛型方法 - 即使你找不到一个简单的数学运算,它也会起作用:

首先设置keyvalue向量,其中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

当然,您可以直接覆盖XY - 我会将它们留在这里以证明它有效。

答案 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