我有以下数据框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中的第一行和为1,因此a4将设置为zero.In,第二行和在第3列中将变为1.2,因此a3将设置为0.4,a4将设置为0,以确保行和不超过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发布于 2016-09-15 19:05:24
如果你在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或者使用最大值(更短一点)
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 100https://stackoverflow.com/questions/39509331
复制相似问题