为什么功能ifelse和内部不能一起工作?作为说明问题的一个例子,我有以下代码。我想要的是创建两个列(Petal.Dim1和Petal.Dim2,它们只是Petal.Width和Petal.Length),但只要Sepal.Length大于5就会切换。
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 :(得分: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并避免within
或transform
:
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
也许它更快,但我不确定。
答案 1 :(得分: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)
})