2014-04-23 117 views
0

我在我的數據集中有一列包含0,1和2的集合。2是來自以前轉換的一個奇怪的剩餘,我需要將它們轉換爲1. I已經寫了一個簡單的循環來做到這一點使用for循環重寫變量R

for (i in my.cl.accept$enroll){ 
    if (i==2){ 
    i=1 
    } 
} 

但是,這不會改變數據幀的實際內容。 ifelse()不起作用,因爲我根本不需要更改其他數字;只是數字2.

我一直在使用R多一點後,來自蟒蛇,我有什麼簡單的事情我誤解在這裏?

+0

My.cl.accept $ col [mca $ col == 2] = 1 –

+0

'my.cl.accept $ enroll [my.cl.accept $ enroll == 2] < - 1' – thelatemail

+0

您需要更改值並將其重新分配給新變量。看到下面的許多答案。 –

回答

0

讓我們產生一組樣本:

set.seed(10) 
DF <- data.frame(
    a=1:10, 
    b=sample(0:2,10,rep=T)) 
DF 

現在,用1替換對應於2的每個條目:

DF$b[DF$b==2] <- 1 
DF 

注意:這是一種向量化方法,並且始終比循環迭代運行得更快。

+0

這也改變了'DF $ a [4]'到'1' - 你想要:'DF $ b [DF $ b == 2 ] < - 1' – thelatemail

+0

只是修復它。再試一次! 你也可以試試:'DF [DF $ b == 2,2] < - 1'! – Shambho

0

不知道這是你想要的嗎?

> A<- 1:10 
> B<- c(rep(0,5), rep(1,3), rep(2,2)) 
> data <- data.frame(A,B) 
> data 
    A B 
1 1 0 
2 2 0 
3 3 0 
4 4 0 
5 5 0 
6 6 1 
7 7 1 
8 8 1 
9 9 2 
10 10 2 

> data[data$B==2,]$B <- 1 
> data 
    A B 
1 1 0 
2 2 0 
3 3 0 
4 4 0 
5 5 0 
6 6 1 
7 7 1 
8 8 1 
9 9 1 
10 10 1 
0

您確定您正確地使用ifelse?它實際上確實允許你只改變一個值到另一個。這裏有一個例子:

> x <- sample(c(0, 1, 2), 10, TRUE) 
> x 
## [1] 2 1 1 0 2 2 0 0 2 1 
> ifelse(x == 2, 1, x) 
## [1] 1 1 1 0 1 1 0 0 1 1 

以供將來參考,您的老式for循環應該是這樣的......

for (i in 1:length(my.cl.accept$enroll)){ 
    if (my.cl.accept$enroll[i] == 2){ 
    my.cl.accept$enroll[i] <- 1 
    } else { 
    my.cl.accept$enroll[i] 
    } 
} 
+0

是的,但正常的舊索引可能更直接。 – thelatemail

+0

哈,從來沒有想過寫這樣的...我想我不是 – Mike