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