需要帮助在R中实现一个功能

时间:2017-11-06 15:07:18

标签: r function for-loop apply

我正在尝试以这样的方式编写代码来利用脚本,因为我经常以这种格式输出并且必须逐个复制/粘贴到Excel中才是真正的苦差事。但是,在实现这些功能方面我很困惑。

所以,我的数据采用以下形式:

Condition Sample1 Sample2 .... Sample n
T1        6.99    5.80    ....  n_1      
T2        2.05    3.04    ....  n_1      
T3        4.50    4.69    ....  n_1      
T4        4.71    5.22    ....  n_1      
T5        5.66    3.65    ....  n_1      
T6        9.76    2.89    ....  n_1      

我需要应用以下等式:Equation,其中x是单独的条目,n是系数,因此完整的等式看起来像这样:

Example

基本上,每列,我需要按顺序考虑每个元素并将其乘以一个连续系数(奇数从1:长度条件),以获得每个样本的答案 S 。我的数据集的大小不会改变 - 它将始终是T1:T6,将改变的是样本1 ... n。理想情况下, S 的值将附加在列的底部,或者保存在单独的数据集中,并参考其所属的样本。

我尝试了很多解决方案,包括调换,但似乎无法绕过它。

我目前在数据集的一部分上实现更简单功能的尝试没有成功。

 for (i in 2:8){dT[7,i] <-
     ((1*dT[1,i])+(3*dT[2,i])+(5*dT[3,i])+(7*dT[4,i])+(9*dT[5,i]))+(11*dT[6,i])
 }

我认为正确的解决方案涉及某种*适用但我对于如何正确使用它们完全无能为力。

编辑:添加可重现的示例:

N   Condition   Sample A    Sample B    Sample C    Sample D

1   T1          91.323      78.758      70.298      66.765
3   T2          -3.737      -1.5        -7.744      -9.247
5   T3          5.205       4.533       2.284       2.178
7   T4          -0.486      -0.068      -1.386      -0.927
9   T5          0.337       -0.139      0.087       0.055
    S        -0.046296296   -0.123654391    0.394039047 0.445258425

3 个答案:

答案 0 :(得分:0)

这样,你想做什么?

per_row <- function(row){
  l <- length(row)
  exp <- 2*(1:l)-1  # all the exponents
  each <- row*(-1)^exp  # compute all of these at once
  return(sum(each)) # return sum
}

#some sample data
datafr <- data.frame(a = sample(1:6), b = 1:6)

#apply per column
apply(datafr, 2, per_row)

答案 1 :(得分:0)

这个怎么样?它应该与您拥有的SampleN列的数量无关。请注意,它是专门针对您的6个条件情况设计的,只有6个奇数的乘数,但您说不会改变所以它应该没问题。


Sleep

答案 2 :(得分:0)

似乎很简单。由于R是向量化的,因此使用向量的乘法。然后是sum

zirconium <- function(x){
    n <- 2*seq_along(x) - 1
    sum(x * (-1)^((n - 1)/2))
}

sapply(dT[-1], zirconium)
#Sample1 Sample2 
#   0.63    2.99

数据。

dT <-
structure(list(Condition = structure(1:6, .Label = c("T1", "T2", 
"T3", "T4", "T5", "T6"), class = "factor"), Sample1 = c(6.99, 
2.05, 4.5, 4.71, 5.66, 9.76), Sample2 = c(5.8, 3.04, 4.69, 5.22, 
3.65, 2.89)), .Names = c("Condition", "Sample1", "Sample2"), class = "data.frame", row.names = c(NA, 
-6L))