首页 > 解决方案 > 检查数据框列之间的多种操作组合的函数

问题描述

这是原始数据框的示例(最后提供的数据)

> DATA
     N_b N_l  A   x.sqr_sum  e_1  e_2  e_3   e_4   e_5   e_6 e_7 e_8 
1    7   6   -36      4032   33.8 21.8  9.8  -2.2 -14.2 -26.2   0   0 
2    7   4   -27      2268   23.6 11.6 -0.4 -12.4   0.0   0.0   0   0 
3    7   4   -27      2268   23.6 11.6 -0.4 -12.4   0.0   0.0   0   0 
4    7   6   -36      4032   33.8 21.8  9.8  -2.2 -14.2 -26.2   0   0 
5    7   6   -36      4032   33.8 21.8  9.8  -2.2 -14.2 -26.2   0   0 
6    7   6   -36      4032   33.8 21.8  9.8  -2.2 -14.2 -26.2   0   0 
7    7   8   -45      6300   44.0 32.0 20.0   8.0  -4.0 -16.0 -28 -40 
8    7   8   -45      6300   44.0 32.0 20.0   8.0  -4.0 -16.0 -28 -40 
9    7   8   -45      6300   44.0 32.0 20.0   8.0  -4.0 -16.0 -28 -40 

我想写一个函数来计算R方程

在此处输入图像描述

我编写下面的代码来计算RN_l负责最大值R

R <- function(x){
  N_b <- x[1]
  N_l <- x[2]
  N_l_seq <- seq(N_l)
  A <- x[3]
  x.sqr_sum <- x[4]
  e <- x[5:12]
  m <- Multi.Presence$m[N_l_seq]
  f <- m * (N_l_seq/N_b + A * cumsum(e) / x.sqr_sum)
  c(val = max(f), pos = which.max(f))
}

DATA <- cbind(DATA, vars = t(apply(DATA, 1, R)))

在上面的函数中,通过定义R计算所有可能的值。问题是我不想像函数中写的那样乘以。我想修改它,以便它计算与当前值相同数量的所有可能组合。N_lN_l_seq <- seq(N_l)cumsum(e)Re_1, e_2, e_3,...N_l

例子

如果,则为的 3 个的所有可能组合(例如和)计算N_l = 3的等式。当 时,为的 5 个的所有可能组合计算的等式,以此类推。fcumsume_1, e_2, e_3, e_4, e_5, e_6, e_7, e_8cumsum(e_1, e_8, e_6)cumsum(e_7, e_2, e_4)N_l = 5fcumsume_1, e_2, e_3, e_4, e_5, e_6, e_7, e_8

问题

我不确定如何更新f方程,所以它不是计算cumsum()所有可能e值的 ,而是计算cumsum()等于当前值的数字的所有组合N_le

数据

> dput(DATA)
structure(list(N_b = c(7, 7, 7, 7, 7, 7, 7, 7, 7), N_l = c(6, 
4, 4, 6, 6, 6, 8, 8, 8), A = c(-36, -27, -27, -36, -36, -36, 
-45, -45, -45), x.sqr_sum = c(4032, 2268, 2268, 4032, 4032, 4032, 
6300, 6300, 6300), e_1 = c(33.8, 23.6, 23.6, 33.8, 33.8, 33.8, 
44, 44, 44), e_2 = c(21.8, 11.6, 11.6, 21.8, 21.8, 21.8, 32, 
32, 32), e_3 = c(9.8, -0.399, -0.399, 9.8, 9.8, 9.8, 20, 20, 20), 
e_4 = c(-2.2, -12.4, -12.4, -2.2, -2.2, -2.2, 8, 8, 8), e_5 = 
c(-14.2, 0, 0, -14.2, -14.2, -14.2, -4, -4, -4), e_6 = c(-26.2, 
0, 0, -26.2, -26.2, -26.2, -16, -16, -16), e_7 = c(0, 0, 0, 0, 
0, 0, -28, -28, -28), e_8 = c(0, 0, 0, 0, 0, 0, -40, -40, -40), 
S = c(12, 9, 9, 12, 12, 12, 15, 15, 15)), row.names = c(1L, 3L, 
4L, 115L, 116L, 117L, 199L, 200L, 201L), class = "data.frame")

因变量m在下面的数据框中定义:

> dput(Multi.Presence)
structure(list(N_l = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), m = c(1.2, 
1, 0.85, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65)), row.names = c(NA, 
-10L), class = "data.frame")

标签: rfunctioncombinationsapply

解决方案


我不确定这是否是你想要的。我猜你应该使用combn而不是cumsum在你的函数R中。

  • 作为第一步,我合并Multi.Presence到,以便您可以读取相对于DATA的相应值mN_l
df <- merge(DATA, Multi.Presence, by = "N_l")
  • 然后,我重写了函数R,使其接受的行df作为参数
R <- function(x){
  N_l <- x["N_l"]
  N_b <- x["N_b"]
  N_l_seq <- seq(N_l)
  A <- x["X_ext"]
  x.sqr_sum <- x["x.sqr_sum"]
  e <- x[grepl("e_\\d",names(x))]
  m <- x["m"]
  f <- m * (N_l/N_b + A * combn(e,N_l,sum) / x.sqr_sum)
  c(val = max(f), pos = which.max(f))
}
  • 最后,您可以按行执行函数Rapply例如,
> apply(df,1,R)
          [,1]       [,2]    [,3]    [,4]    [,5]    [,6]      [,7]      [,8]
val  0.4704685  0.4704685  0.7475  0.7475  0.7475  0.7475 0.6685714 0.6685714
pos 56.0000000 56.0000000 28.0000 28.0000 28.0000 28.0000 1.0000000 1.0000000
         [,9]
val 0.6685714
pos 1.0000000

更新

我不知道你想如何处理combn,但下面是更新

R <- function(x){
  # browser()
  N_l <- x["N_l"]
  N_b <- x["N_b"]
  N_l_seq <- seq(N_l)
  A <- x["A"]
  x.sqr_sum <- x["x.sqr_sum"]
  e <- x[grepl("e_\\d",names(x))]
  m <- Multi.Presence$m[N_l_seq]
  f <- m * sapply(N_l_seq,function(k) N_l/N_b + A * max(combn(e,k,sum)) / x.sqr_sum)
  c(val = max(f), pos = which.max(f))
}

推荐阅读