将最小值和最大值组合成R中的rowise函数
我在excel电子表格中使用了一些代码,这些代码使用了将最小值和最大值组合成R中的rowise函数,r,max,apply,min,R,Max,Apply,Min,我在excel电子表格中使用了一些代码,这些代码使用了min和max,我正试图转换到R。 我有两列,“mini”和“maxi”,它们表示一系列可能的值。我试图填充的第三列是介于5和19之间的范围的比例。查看示例中的第一行,如果“mini”为10,而“maxi”为15,则5-19列的值应为1,因为范围完全在该范围内。在第9行中,“mini”是1,“maxi”是3,这意味着它完全超出了5-19范围,因此应该是0。然而,第3行跨越了这个范围,只有25%落在5-19的范围内,因此输出值应该是0.25 编
min
和max
,我正试图转换到R。
我有两列,“mini”
和“maxi”
,它们表示一系列可能的值。我试图填充的第三列是介于5和19之间的范围的比例。查看示例中的第一行,如果“mini”
为10,而“maxi”
为15,则5-19列的值应为1,因为范围完全在该范围内。在第9行中,“mini”
是1,“maxi”
是3,这意味着它完全超出了5-19范围,因此应该是0。然而,第3行跨越了这个范围,只有25%落在5-19的范围内,因此输出值应该是0.25
编辑我已经更新了R,尽管以前有几种解决方案有效,但现在我发现了错误:
Error in mutate_impl(.data, dots, caller_env()) :
attempt to bind a variable to R_UnboundValue
以下是DF外观的示例:
ID mini maxi
1 10 15
2 17 20
3 2 5
4 40 59
5 40 59
6 21 39
7 21 39
8 17 20
9 1 3
10 4 6
我以前使用的代码是这样的:
=MAX((MIN(maxi,19)-MAX(mini,5)+1),0)/(maxi-mini+1)
我最初试着使用类似于
percentoutput <- mutate(DF, output = MAX((MIN(maxi,19) - MAX(mini,5) + 1),0)/(maxi-mini + 1))
我们可以使用
rowwise
计算min
与max
之间5:19
的比值
library(dplyr)
df %>% rowwise() %>% mutate(ratio = mean(min:max %in% 5:19))
# ID min max ratio
# <dbl> <dbl> <dbl> <dbl>
# 1 1 10 15 1
# 2 2 17 20 0.75
# 3 3 2 5 0.25
# 4 4 40 59 0
# 5 5 40 59 0
# 6 6 21 39 0
# 7 7 21 39 0
# 8 8 17 20 0.75
# 9 9 1 3 0
#10 10 4 6 0.667
以下是使用
数据的矢量化版本。表:
DT[, portion := {
mn <- pmax(mini, lb)
mx <- pmin(maxi, ub)
fifelse(mn <= mx, (mx - mn + 1L) / (maxi - mini + 1L), 0)
}]
数据:
库(data.table)
DT我们可以使用map2
library(dplyr)
library(purrr)
df %>%
mutate(ratio = map2_dbl(min, max, ~ mean(.x:.y %in% 5:19)))
这个答案比我最初想要的要干净得多,谢谢!我在实际数据集中遇到了一个问题,即“min:max:NA/NaN参数”。检查了列中的零和NA值,但数据看起来正常。有什么想法吗?您能解释一下dplyr解决方案中的“最小值:最大值%5:19”是什么意思吗?我可能在这里遗漏了什么…min:max
和5:19
在这两个变量之间生成序列。使用%in%
我们检查最小值和最大值之间有多少个数字在5到19之间,使用平均值
我们只取比率。根据错误消息,我认为您可能在某处有NA
值,因为NA:4
给出了相同的错误消息。感谢您的解释。我刚刚也解决了NA/NaN问题。我过滤掉了NA值,但忘了检查空格。它现在工作得很好。我已经更新了R,现在得到了错误“mutate_impl(.data,dots,caller_env()):尝试将变量绑定到R_UnboundValue”。我也尝试过使用map2解决方案,但得到了相同的错误。你知道会发生什么事吗?真奇怪。我使用的是最新的R4.0.0,这两个答案对我来说仍然是一样的。我已经更新了R,现在出现了错误“mutate_impl(.data,dots,caller_env()):尝试将变量绑定到R_UnboundValue”。我从rowise/mutate解决方案以及您提供的map2解决方案中得到了错误,并且得到了相同的错误。你知道会发生什么事吗?
DT[, portion := {
mn <- pmax(mini, lb)
mx <- pmin(maxi, ub)
fifelse(mn <= mx, (mx - mn + 1L) / (maxi - mini + 1L), 0)
}]
DF$mn <- pmax(DF$mini, lb)
DF$mx <- pmin(DF$maxi, ub)
DF$portion <- ifelse(DF$mn <= DF$mx, (DF$mx - DF$mn + 1L) / (DF$maxi - DF$mini + 1L), 0)
ID mini maxi portion
1: 1 10 15 1.0000000
2: 2 17 20 0.7500000
3: 3 2 5 0.2500000
4: 4 40 59 0.0000000
5: 5 40 59 0.0000000
6: 6 21 39 0.0000000
7: 7 21 39 0.0000000
8: 8 17 20 0.7500000
9: 9 1 3 0.0000000
10: 10 4 6 0.6666667
library(data.table)
DT <- fread("ID mini maxi
1 10 15
2 17 20
3 2 5
4 40 59
5 40 59
6 21 39
7 21 39
8 17 20
9 1 3
10 4 6")
lb <- 5L
ub <- 19L
library(dplyr)
library(purrr)
df %>%
mutate(ratio = map2_dbl(min, max, ~ mean(.x:.y %in% 5:19)))