嵌套的ifelse R函数传递给sapply()以创建新的data.frame
假设我们创建一个data.frame,如下所示:嵌套的ifelse R函数传递给sapply()以创建新的data.frame,r,dataframe,R,Dataframe,假设我们创建一个data.frame,如下所示: > hugs_per_day <- rnorm(10) > hugs_per_day <- as.data.frame(hugs_per_day) > hugs_per_day hugs_per_day 1 -2.500457495 2 -0.204545274 3 -0.955424927 4 0.320184701 5 1.822908001 6 -0.058679520 7 -0.276
> hugs_per_day <- rnorm(10)
> hugs_per_day <- as.data.frame(hugs_per_day)
> hugs_per_day
hugs_per_day
1 -2.500457495
2 -0.204545274
3 -0.955424927
4 0.320184701
5 1.822908001
6 -0.058679520
7 -0.276004919
8 0.175341993
9 -0.137404974
10 0.005096691
nested_ifelse <- function(x){
ifelse (x > 1, mood <- "happy",
ifelse(x < 0, mood <- "sad",
mood <- "same as yesterday" ))
return(mood)
}
nested_ifelse <- function(x){
mood <- ifelse (x > 1, "happy",
ifelse(x < 0, "sad",
"same as yesterday" ))
return(mood)
}
d$mood2 <- sapply(d$v, nested_ifelse)
>每天拥抱每天拥抱每天拥抱
每天拥抱你
1 -2.500457495
2 -0.204545274
3 -0.955424927
4 0.320184701
5 1.822908001
6 -0.058679520
7 -0.276004919
8 0.175341993
9 -0.137404974
10 0.005096691
我们希望每天运行一个函数,根据结果返回一个值,如下所示:
> hugs_per_day <- rnorm(10)
> hugs_per_day <- as.data.frame(hugs_per_day)
> hugs_per_day
hugs_per_day
1 -2.500457495
2 -0.204545274
3 -0.955424927
4 0.320184701
5 1.822908001
6 -0.058679520
7 -0.276004919
8 0.175341993
9 -0.137404974
10 0.005096691
nested_ifelse <- function(x){
ifelse (x > 1, mood <- "happy",
ifelse(x < 0, mood <- "sad",
mood <- "same as yesterday" ))
return(mood)
}
nested_ifelse <- function(x){
mood <- ifelse (x > 1, "happy",
ifelse(x < 0, "sad",
"same as yesterday" ))
return(mood)
}
d$mood2 <- sapply(d$v, nested_ifelse)
nested_if else 1,mood您没有使用set.seed,因此示例不可复制,但这将为您提供所需的向量:
hugs_per_day$mood <- c("sad","same as yesterday","happy" )[
findInterval( hugs_per_day$hugs_per_day, c(-Inf, 0, 1) ) ]
hugs_per_day
hugs_per_day mood
1 0.5747557 same as yesterday
2 -1.0236557 sad
3 -0.0151383 sad
4 -0.9359486 sad
5 1.1022975 happy
6 -0.4755931 sad
7 -0.7094400 sad
8 -0.5012581 sad
9 -1.6290935 sad
10 -1.1676193 sad
hugs\u per\u day$mood我不确定这是否能解决您的实际问题,但我想指出,您并不总是需要嵌套ifelse
函数。有时您可以按顺序使用它们,只需确保顺序正确,这样就不会过度写入以前的值
set.seed(229)
hugs_per_day <- data.frame(hugs=rnorm(10))
hugs_per_day$mood <- "same as yesterday"
hugs_per_day$mood <- with(hugs_per_day, ifelse(hugs > 1, "happy", mood))
hugs_per_day$mood <- with(hugs_per_day, ifelse(hugs < 0, "sad", mood))
set.seed(229)
每天拥抱嵌套的ifelse应该是这样的:
> hugs_per_day <- rnorm(10)
> hugs_per_day <- as.data.frame(hugs_per_day)
> hugs_per_day
hugs_per_day
1 -2.500457495
2 -0.204545274
3 -0.955424927
4 0.320184701
5 1.822908001
6 -0.058679520
7 -0.276004919
8 0.175341993
9 -0.137404974
10 0.005096691
nested_ifelse <- function(x){
ifelse (x > 1, mood <- "happy",
ifelse(x < 0, mood <- "sad",
mood <- "same as yesterday" ))
return(mood)
}
nested_ifelse <- function(x){
mood <- ifelse (x > 1, "happy",
ifelse(x < 0, "sad",
"same as yesterday" ))
return(mood)
}
d$mood2 <- sapply(d$v, nested_ifelse)
nested_ifelse()您可以使用示例nested_ifelse()函数代替findInterval()?我想,这是把一个问题概括得太多的危险。findInterval()似乎找到了一个解决方案,但如果引入另一个向量进行比较呢?例如,它是否适用于x[,1]>x[,2],而不是x>1?有时可能需要一个特殊的函数,在这种情况下,您将如何将该函数传递给sapply()?是的,您可以使用嵌套的ifelse
,但它们在嵌套中的深度限制为7。与使用ifelse
子句添加嵌套级别相比,向选择向量添加元素的代码要少得多。你只需把一个新的项目添加到第一个向量中,一个新的项目就添加到每个新的级别的FiffStector矢量中。谢谢你给我一个新的方法来考虑。注意,你确实需要1个+ε来等价,因为原来的定义<代码> NestistdIfEnter/代码>的x==1是“代码”,“与昨天一样”<代码>,而不是<代码>“快乐”。
…对于我的方法(可能不太理想),这是完美的。谢谢,谢谢乔希。知道如何以多种方式处理问题是件好事。