2016-11-10 108 views
1
> 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 

我有一個包含值1到7我想改變1的至7的(反之亦然),2層的至6的一個data.frame(反之亦然),3到5(反之亦然),4將保持爲4。即基本上我想'扭轉'數字。我想寫一個for循環來遍歷每列中的每個值並使用ifelse語句,但是我怎麼能同時更改7到1和1到7?R:如何改變在data.frame值

回答

10

考慮所有你想切換號碼的對具有8的總和,你可以從8減去你的原始數據幀和所有的值應被還原,只要你想,那麼你可以做8 - dummy

dummy = 8 - 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 
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 
+0

你應該編輯了Psidom的答案。 – Uwe

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 - 我讓他們在這裏展示它的工作。