作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下数据框 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/
我是一名优秀的程序员,十分优秀!