首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对dataframe中的几行求和

问如何对dataframe中的几行求和
EN

Stack Overflow用户
提问于 2016-09-15 18:56:27
回答 1查看 104关注 0票数 3

我有以下数据框u

代码语言:javascript
复制
   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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-15 19:05:24

如果你在df中只有正数,你可以这样做

代码语言:javascript
复制
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

或者使用最大值(更短一点)

代码语言:javascript
复制
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库

代码语言:javascript
复制
u2=as.matrix(u)
pmax(u2-pmax(rowCumsums(u2)-1,0),0)

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39509331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档