Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将最小值和最大值组合成R中的rowise函数_R_Max_Apply_Min - Fatal编程技术网

将最小值和最大值组合成R中的rowise函数

将最小值和最大值组合成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 编

我在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

编辑我已经更新了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)))