R 函数,用于检查数据帧列之间的多个操作组合

R 函数,用于检查数据帧列之间的多个操作组合,r,function,combinations,apply,R,Function,Combinations,Apply,以下是原始数据帧的示例(最后提供的数据) 我想写一个函数,从方程中计算R 我在下面写代码是为了计算R,而N\u 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

以下是原始数据帧的示例(最后提供的数据)

我想写一个函数,从方程中计算
R

我在下面写代码是为了计算
R
,而
N\u 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)))
因变量
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")

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

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)))
  • 作为第一步,我将
    Multi.Presence
    合并到
    DATA
    ,以便您可以读取
    m
    相对于
    N\u l
    的相应值
  • 最后,您可以在
    apply
    中按行执行函数
    R
    ,例如

更新

我不知道您想如何处理
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))
}

R你是指排列还是组合?@thomasscoding composition!我会改变的,谢谢!因此,我可以看到您如何使用
combn
,这正是我想要的。但是我没有将multi.presence数据框与数据合并的原因是我正在查看
N_l_seq
中的所有值。我试着运行代码,但我得到的错误是“combn(e,N_l_seq,sum)中的error:length(m)=1L不是真的”,因此在我的代码中,我将
m
保留在不同的数据帧中,并更改您提供的
combn(e,N_l_seq,sum)
行,所以我不知道如何在function@MaralDorri你什么意思?“但我没有将multi.presence数据框与数据合并的原因是我正在查看N_l_seq中的所有值”?我有点困惑,因为你在帖子中说你从8个值中选择
N_l
求和。
N_l
是一个单数,例如5。我想计算
R
中的所有值(N_l)
。由于
m
依赖于
N\u l
我将其作为不同的数据帧保存。因此在
N\u l\u seq=c(1,2,3,4,5)的每次迭代中
它选择了正确的
m
值。同样,我希望
combn
函数每次都向我们提供
N_l_seq
的写入。这有意义吗?谢谢!我不知道我可以在另一个函数中编写函数。计算出的
R
值比预期的要大,我想澄清一些问题g、
pos=which.max(f))
这个术语应该告诉我
N_l_seq
中的哪个术语负责
max(f)
,但是对于这个位置输出,我得到了更大的数字,比如30和25,
N_l
值都小于10
df <- merge(DATA, Multi.Presence, by = "N_l")
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))
}
> 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
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))
}