2011-10-13 92 views
1

从其他塔计算一列的值有关数据帧AB:创建循环函数中的R

AB<-data.frame(ID=c(1,2,4),A=c(2,8,8),B=c(6,2,2),dE=c(0,0,0)) 

我想应用以下公式:AB$dE=AB$B/AB$A

ID A B dE 
1 2 6 0 
2 8 2 0 
4 8 2 0 

转换的以上:

ID A B dE 
1 2 6 3 
2 8 2 0.25 
4 8 2 4 

因为我有包含A和B的不同列名的几个文件,这将是更实际编写一个函数,像

dEs <- function(data,nume,denom){ 
     #define which datafile and numerator/denom column 
     #so in case of AB this becomes AB$dE; 
     # i dont know the correct way to do this. 
     dE=data.'$dE' 
     start=data.'$'.nume #to become AB$A 
     end=data.'$'.denom #to become AB$B 
     for(i in data){ 
      dE[i] <- (start[i]/end[i]) 
     } 
} 

这样我就可以在必要时改变分子/分母。

+0

这是无稽之谈这里写一个函数,因为你不需要任何环路 - 只写'AB $ DE = AB $ B/AB $ A'(或更好的'AB $ dE <-AB $ B/AB $ A')。 – mbq

回答

2

你并不需要一个循环,因为R的矢量:

> AB <- data.frame(ID=c(1,2,4),A=c(2,8,8),B=c(6,2,2),dE=c(0,0,0)) 
> AB <- transform(AB, dE=B/A) 
> AB 
    ID A B dE 
1 1 2 6 3.00 
2 2 8 2 0.25 
3 4 8 2 0.25 

如果你真的想要一个功能,您可以使用[[]]选择列,因为data.frame只是一个列表(假设nume和DENOM是你想要的列名)特征向量:

dEs <- function(data,nume,denom){ 
    data$dE <- data[[nume]]/data[[denom]] 
}