gpt4 book ai didi

r - 如何对数据框中的几行求和

转载 作者:行者123 更新时间:2023-12-02 03:11:58 28 4
gpt4 key购买 nike

我有以下数据框 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 将设置为零。在第二行中,总和在第 3 列中变为 1.2,因此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

最佳答案

如果 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

关于r - 如何对数据框中的几行求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39509331/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com