2014-03-24 99 views
1

分配列为什么函数ifelse和内部不能一起工作?作为例子来说明问题,我有以下代码。我想要是创建两列(Petal.Dim1和Petal.Dim2这只是Petal.Width和Petal.Length),但只要切换为Sepal.Length大于5使用ifelse和

data(iris) 
within(iris, ifelse(Sepal.Length>5,{ 
       Petal.Dim1 <-Petal.Width 
       Petal.Dim2 <-Petal.Length 
      }, { 
       Petal.Dim1<-Petal.Length 
       Petal.Dim2<-Petal.Width})) 
+0

你误读了帮助文件('?iflese')。 'ifelse'返回一个与测试形状相同的值。也就是说,它不执行操作,它返回值。 –

回答

1

我不能说什么是你的代码错误,但我可以建议使用transform

data(iris) 
dat <- transform(iris, 
    Petal.Dim1=ifelse(Sepal.Length>5, Petal.Width, Petal.Length), 
    Petal.Dim2=ifelse(Sepal.Length>5, Petal.Length, Petal.Width) 
) 
str(dat) 

编辑: 更健壮的方法是(在我看来)来存储indizes,避免withintransform

idx <- iris[,"Sepal.Length"] > 5 
dat <- iris 
dat[idx, "Dim1"] <- Petal.Width 
dat[idx, "Dim2"] <- Petal.Length 
dat[!idx, "Dim1"] <- Petal.Length 
dat[!idx, "Dim2"] <- Petal.Width 

也许它更快,但我不确定。

+0

酷,这项工作,但我怎么把Petal.Dim1和Petal.Dim2在1 ifelse?我必须在较大的数据集上使用多列进行缩放。 – geodex

1

您必须小心使用非标准评估。 within只是一个围绕eval的包装,所以这两个块都会被执行,因为它不知道ifelse的行为。你想要的东西是这样的:

dat <- within(iris, { 
    Petal.Dim1 <- ifelse(Sepal.Length > 5, Petal.Width, Petal.Length) 
    Petal.Dim2 <- ifelse(Sepal.Length > 5, Petal.Length, Petal.Width) 
})