我有以下数据框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
答案 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