2013-03-15 91 views
4

使用iflelse值我有如下的數據非常瑣碎的問題:替換中的R

sample<-list(c(10,12,17,7,9,10),c(NA,NA,NA,10,12,13),c(1,1,1,0,0,0)) 
sample<-as.data.frame(sample) 
colnames(sample)<-c("x1","x2","D") 

>sample 
x1 x2 D 
10 NA 1 
12 NA 1 
17 NA 1 
7 10 0 
9 20 0 
10 13 0 

注:與d的觀測數= 1是相同d = 0

現在,我想創建一個變量,當和D=1的值爲D=0時,它的值與D=0有關。預期的輸出:

x1 x2 D x3 
10 NA 1 10 
12 NA 1 20 
17 NA 1 13 
7 10 0 NA 
9 20 0 NA 
10 13 0 NA 

我嘗試使用ifelse功能如下:

sample.data$x3<-with(sample.data, ifelse(D==1,x2[which(D==0)],x2[which(D==1)])) 

我得到了以下錯誤:

logical(0) 

我也試過如下:

sample.data$x3<-with(sample.data, ifelse(D==1,tail(x2,3),head(x2,3))) 

再次,我得到了同樣的錯誤:

logical(0) 

任何想法是什麼在這裏?

+4

'$樣品X3 < - 樣品$ X2 [順序(樣品$ D)]' – Roland 2013-03-15 18:16:53

+0

感謝您的快捷方案。 – Metrics 2013-03-15 18:22:00

回答

4

您的命令中的邏輯是健全的,但是您錯誤地引用了數據幀。您只需在sample之後的整個代碼行中刪除.data。所以這個命令會給你你需要的東西:

sample$x3<-with(sample,ifelse(D==1,x2[which(D==0)],x2[which(D==1)])) 

該代碼仍然是一個有點冗長但是。

正如@Arun在註釋中指出的那樣,在選擇x2值作爲ifelse的結果使用時,不需要包含which()函數。下面的代碼將給你相同的結果:

sample$x3<-with(sample,ifelse(D==1,x2[D==0],x2[D==1])) 
+0

感謝您指出錯誤。 – Metrics 2013-03-15 18:21:27

+1

當然。我還會注意到,你正在以一種奇怪的方式創建數據框 - 我會這樣做:'sample <-data.frame(x1 = c(10,12,17,7) ,9,10),x2 = c(NA,NA,NA,10,20,13),D = c(1,1,1,0,0,0))。你可能想[刷一下數據幀](http://msenux.redwoods.edu/math/R/dataframe.php)。 – uptownnickbrown 2013-03-15 18:25:35

+2

(+1)你不需要'哪個',是嗎? – Arun 2013-03-15 18:45:57

5

你知道data.table,這裏是它的解決方案......

install.packages("data.table") 
library(data.table) 

sample = as.data.table(sample) 
sample[,x4:=ifelse(D==1,x2[D==0],x2[D==1])] 
+0

@ statquant:是的,我知道data.table,但沒有用太多。感謝您的解決方案。 – Metrics 2013-03-15 19:41:06