gpt4 book ai didi

r - ifelse 按行排序的值

转载 作者:行者123 更新时间:2023-12-04 12:30:11 26 4
gpt4 key购买 nike

我有一个数据框(示例数据):

id <- c(1, 2, 3)
ex1 <- c(0.8, 0.2, 0.3)
ex2 <- c(0.1, 0.4, 0.04)
ex3 <- c(0.04, 0.3, 0.5)
ex <- c(1, 1, 1)
ran <- c(0.5, 0.7, 0.6)
dat <- data.frame(id, ex1, ex2, ex3, ex, ran)

dat
id ex1 ex2 ex3 ex ran
1 1 0.8 0.10 0.04 1 0.5
2 2 0.2 0.40 0.30 1 0.7
3 3 0.3 0.04 0.50 1 0.6

我想用 if-else-condition 改变“ex”的值。当“ran”小于或等于 ex$ 变量的最高值时,“ex”应更改为 5(任意)。它也应该大于其他 ex$ 变量,但它们应该被排序——第二大值加到最小值上。以下是所有 ID 的示例,以 ID 1 开头:

dat$ex <- ifelse(dat$ran <= dat$ex1 & dat$ran > dat$ex1 + dat$ex2, 5, dat$ex)

此处,ex1 是最大值,其次是 ex1 和 ex2。

对于 id 2,它应该是:

dat$ex <- ifelse(dat$ran <= dat$ex2 & dat$ran > dat$ex3 + dat$ex1, 5, dat$ex)

这里,ex2 是最大值,其次是 ex3,最后是 ex1。

对于 id 3:

dat$ex <- ifelse(dat$ran <= dat$ex3 & dat$ran > dat$ex1 + dat$ex2, 5, dat$ex)

这里,ex3 是最大值,其次是 ex1,然后是 ex2。

现在问题来了:如何泛化 ifelse 语句?注意:重要的是,两个较小值的求和是按照示例中的实现方式执行的。我需要通过 id 在 ifelse 中识别 ex1、ex2 和 ex3 的排序值。

最佳答案

下面是我们如何使用 dplyrtidyr 完成任务的方法:

library(dplyr)
library(tidyr)
dat %>%
pivot_longer(
cols = ex1:ex3
) %>%
arrange(id, desc(value)) %>%
group_by(id) %>%
mutate(ex = ifelse(ran <= value[1] & ran > sum(value[2], value[3]), 5, ex)) %>%
pivot_wider(
names_from=name
)

输出:

 id    ex   ran   ex1   ex2   ex3
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 5 0.5 0.8 0.1 0.04
2 2 1 0.7 0.2 0.4 0.3
3 3 1 0.6 0.3 0.04 0.5

关于r - ifelse 按行排序的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69699174/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com