如何在数据帧中对几行求和

时间:2016-09-15 10:56:27

标签: r

我有以下数据框u

   u<-data.frame(a1=c(0.1,0.2,0.4),a2=c(0.5,0.4,0.8),a3=c(0.4,0.6,0.7),a4=c(0.1,0.4,0.6))

df          
a1  a2  a3  a4
0.1 0.5 0.4 0.1
0.2 0.4 0.6 0.4
0.4 0.8 0.7 0.6

我正在尝试创建一个新的数据帧,其中行总和不超过1.因此,对于第一行,a3中的a为1,因此a4将设置为零。在第二行中,sum在列中变为1.2 3因此a3将设置为0.4,a4将设置为零,以确保行的总和不超过1。 结果数据框u

df          
a1  a2  a3  a4
0.1 0.5 0.4 0
0.2 0.4 0.4 0
0.4 0.6 0   0

1 个答案:

答案 0 :(得分:1)

如果df中只有正数 你可以做这样的事情

u<-data.frame(a1=c(0.1,0.2,0.4),a2=c(0.5,0.4,0.8),a3=c(0.4,0.6,0.7),a4=c(0.1,0.4,0.6))
z=t(apply(u,1,cumsum))-1 # difference between 1 and cumsum
z[z<0]=0
u2=u-z
u2[u2<0]=0
u2


  a1  a2  a3 a4
1 0.1 0.5 0.4  0
2 0.2 0.4 0.4  0
3 0.4 0.6 0.0  0

或pmax使用(略短)

u<-data.frame(a1=c(0.1,0.2,0.4),a2=c(0.5,0.4,0.8),a3=c(0.4,0.6,0.7),a4=c(0.1,0.4,0.6))
z=pmax(t(apply(u,1,cumsum))-1,0) # positive difference between 1 and cumsum
u2=pmax(as.matrix(u-z),0)
u2

或使用matrixStats

u2=as.matrix(u)
pmax(u2-pmax(rowCumsums(u2)-1,0),0)

最后一个是我的变种中最快的

Unit: microseconds
 expr     min      lq     mean   median      uq      max neval
 f1() 804.139 829.798 909.1229 861.2580 889.818 4150.103   100
 f2() 764.422 789.635 874.3958 808.8240 848.763 3832.822   100
 f3()  96.390 110.669 126.7079 119.5955 131.420  253.469   100