我在我的數據集中有一列包含0,1和2的集合。2是來自以前轉換的一個奇怪的剩餘,我需要將它們轉換爲1. I已經寫了一個簡單的循環來做到這一點使用for循環重寫變量R
for (i in my.cl.accept$enroll){
if (i==2){
i=1
}
}
但是,這不會改變數據幀的實際內容。 ifelse()
不起作用,因爲我根本不需要更改其他數字;只是數字2.
我一直在使用R多一點後,來自蟒蛇,我有什麼簡單的事情我誤解在這裏?
我在我的數據集中有一列包含0,1和2的集合。2是來自以前轉換的一個奇怪的剩餘,我需要將它們轉換爲1. I已經寫了一個簡單的循環來做到這一點使用for循環重寫變量R
for (i in my.cl.accept$enroll){
if (i==2){
i=1
}
}
但是,這不會改變數據幀的實際內容。 ifelse()
不起作用,因爲我根本不需要更改其他數字;只是數字2.
我一直在使用R多一點後,來自蟒蛇,我有什麼簡單的事情我誤解在這裏?
讓我們產生一組樣本:
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
注意:這是一種向量化方法,並且始終比循環迭代運行得更快。
這也改變了'DF $ a [4]'到'1' - 你想要:'DF $ b [DF $ b == 2 ] < - 1' – thelatemail
只是修復它。再試一次! 你也可以試試:'DF [DF $ b == 2,2] < - 1'! – Shambho
不知道這是你想要的嗎?
> 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
您確定您正確地使用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]
}
}
是的,但正常的舊索引可能更直接。 – thelatemail
哈,從來沒有想過寫這樣的...我想我不是 – Mike
My.cl.accept $ col [mca $ col == 2] = 1 –
'my.cl.accept $ enroll [my.cl.accept $ enroll == 2] < - 1' – thelatemail
您需要更改值並將其重新分配給新變量。看到下面的許多答案。 –