R:数据帧中行的总和

时间:2015-03-16 17:33:31

标签: r for-loop

我想做什么:我有一个数据框,其中第一列由字符串组成,其余列用数字值填充。我想将前三行添加到三个一组的其余行中,同时对行应用不同的因子,如:row1 * x + row4 * y,row1 * x + row5 * y,row1 * x + row6 * y,然后row2 * x + row4 * y,依此类推,直到row3 * x + row6 * y。然后我想再次做同样的事情,但是x和y的值不同,然后第三次用x和y的不同值。然后我想对1-3行和7-9行进行相同的操作,然后对1-3和10-12进行相同的操作。确切的顺序很重要。我想将所有这些写成新数据框中的行。

我还想组合第一列的各个字符串,添加一个标记,以便我知道我所做的总和,然后是每个组的连续计数器。我想将它添加到我的结果数据框中,所以我可以看到哪一行来自哪里。

我拥有:在广泛使用for循环后,这段代码最终完全符合我的要求,但它很难看,而且我的实际数据实际上很慢(实际数据框有1762列)。

numbers <- data.frame(replicate(10,sample(1:100,12,rep=TRUE))) 
id <- data.frame(id=c("d1","d2","d3","v11","v12","v13","v21","v22","v23","v31","v32","v33"))
data <- cbind(id,numbers)

results <- data.frame() 
data.raw <- data[,-1] 
legend <- data.frame()
q=1 
#################### rows 1-3 with rows 4-6
k=1 # my continuous counter
for(i in 1:3) {
    for(j in 4:6){
        results <- rbind(results,0.99*(data.raw[i,])+0.01*(data.raw[j,]))
        legend[q,1] <- paste(data[i,1],data[j,1],"01",k,sep="_")
        q=q+1
        k=k+1 }}
k=1
for(i in 1:3){
    for(j in 4:6){  
        results <- rbind(results,0.95*(data.raw[i,])+0.05*(data.raw[j,]))
        legend[q,1] <- paste(data[i,1],data[j,1],"05",k,sep="_")
    q=q+1
    k=k+1 }}
k=1
for(i in (1:3)){
    for(j in 4:6){  
        results <- rbind(results,0.9*(data.raw[i,])+0.1*(data.raw[j,]))
        legend[q,1] <- paste(data[i,1],data[j,1],"10",k,sep="_")
        q=q+1 
        k=k+1   }}
#################### rows 1-3 with rows 7-9
k=1
for(i in 1:3){
    for(j in 7:9){
        results <- rbind(results,0.99*(data.raw[i,])+0.01*(data.raw[j,]))
        legend[q,1] <- paste(data[i,1],data[j,1],"01",k,sep="_")
        q=q+1
        k=k+1 }}
k=1
for(i in 1:3){
    for(j in 7:9){  
        results <- rbind(results,0.95*(data.raw[i,])+0.05*(data.raw[j,]))
        legend[q,1] <- paste(data[i,1],data[j,1],"05",k,sep="_")
        q=q+1
        k=k+1 }}
k=1
for(i in 1:3){
    for(j in 7:9){  
        results <- rbind(results,0.9*(data.raw[i,])+0.1*(data.raw[j,]))
        legend[q,1] <- paste(data[i,1],data[j,1],"10",k,sep="_")
        q=q+1 
        k=k+1   }}
#################### rows 1-3 with rows 10-12
k=1
for(i in 1:3){
    for(j in 10:12){
        results <- rbind(results,0.99*(data.raw[i,])+0.01*(data.raw[j,]))
        legend[q,1] <- paste(data[i,1],data[j,1],"01",k,sep="_")
        q=q+1
        k=k+1 }}
k=1
for(i in 1:3){
    for(j in 10:12){    
        results <- rbind(results,0.95*(data.raw[i,])+0.05*(data.raw[j,]))
        legend[q,1] <- paste(data[i,1],data[j,1],"05",k,sep="_")
        q=q+1
        k=k+1 }}
k=1
for(i in 1:3){
    for(j in 10:12){    
        results <- rbind(results,0.9*(data.raw[i,])+0.1*(data.raw[j,]))
        legend[q,1] <- paste(data[i,1],data[j,1],"10",k,sep="_")
        q=q+1 
        k=k+1   }}

mydataframe <- cbind(legend,results)

我想拥有的东西:更漂亮,更短,更快的东西。显然可以用函数替换for循环,但这里是我丢失的地方。我想我可以使用apply系列中的某些东西,但我还没有完全理解函数的概念,然后使用描述性字符串变得更加复杂。

有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

作为第一步,不要使用数据框,而是将它们转换为矩阵。只需更改

results <- data.frame() 
data.raw <- data[,-1] 

results<-c()
data.raw <- as.matrix(data[,-1] )
顶部应该加快速度。