使用数据框R中行的最后一列的最后一个值添加每列

时间:2014-12-27 16:09:52

标签: r dataframe

我想在R中添加每行的最后一列数据框。 我的数据框 -

L   E   B1  P   B2  M   Value
5   5   0   20  2   5   100
10  6   0   40  15  2   150
6   15  0   50  6   10  160
1   10  0   55  5   20  160
0   20  0   80  0   20  200
10  1   20  80  10  10  250
8   2   40  30  5   10  300
5   3   60  30  5   20  350
5   4   30  75  5   20  400
1   0   50  80  0   10  400
2   0   40  60  5   20  500
0   0   60  50  0   30  500

所以第一行就像 -

L   E   B1  P   B2  M   Value
5*100   5*100   0*100   20*100  2*100   5*100   100
10  6   0   40  15  2   150
6   15  0   50  6   10  160
1   10  0   55  5   20  160
0   20  0   80  0   20  200
10  1   20  80  10  10  250
8   2   40  30  5   10  300
5   3   60  30  5   20  350
5   4   30  75  5   20  400
1   0   50  80  0   10  400
2   0   40  60  5   20  500
0   0   60  50  0   30  500

我尝试使用lapply

lapply(df1, function(x) x * tail(x,1) )

但它需要行值,因此如何获取每一行的最后一列值或任何特定列以与R中的所有其他列值一起添加

4 个答案:

答案 0 :(得分:7)

使用dplyr并假设您的数据帧是df:

library(dplyr)

df %>% mutate_each(funs(. * Value), -Value)

答案 1 :(得分:4)

不清楚你是想要乘法还是除法(你要求的和你自己的尝试之间似乎存在矛盾),但这是一种乘法的方法:

cbind(mydf[-length(mydf)] * mydf[[length(mydf)]], mydf[length(mydf)])
#       L    E    B1     P   B2     M Value
# 1   500  500     0  2000  200   500   100
# 2  1500  900     0  6000 2250   300   150
# 3   960 2400     0  8000  960  1600   160
# 4   160 1600     0  8800  800  3200   160
# 5     0 4000     0 16000    0  4000   200
# 6  2500  250  5000 20000 2500  2500   250
# 7  2400  600 12000  9000 1500  3000   300
# 8  1750 1050 21000 10500 1750  7000   350
# 9  2000 1600 12000 30000 2000  8000   400
# 10  400    0 20000 32000    0  4000   400
# 11 1000    0 20000 30000 2500 10000   500
# 12    0    0 30000 25000    0 15000   500

基本思路是将除最后一列之外的所有列乘以最后一列中的值。由于该列已被删除,因此请将其添加回cbind

答案 2 :(得分:4)

这是另一个基本R选项:

n <- ncol(df)
df[-n] <- df[-n] * df[[n]]

注意:运行此代码将修改现有的data.frame。如果你想创建一个新的data.frame并按原样保留旧数据框,你最好使用Ananda Mahto或其他人的答案。

答案 3 :(得分:2)

为了完成图片,您还可以使用data.table

通过引用更新数据
library(data.table)
setDT(df)[, names(df)[-length(df)] := 
            lapply(.SD, "*", df$Value), 
            .SDcols = -"Value"]
df
#        L    E    B1     P   B2     M Value
#  1:  500  500     0  2000  200   500   100
#  2: 1500  900     0  6000 2250   300   150
#  3:  960 2400     0  8000  960  1600   160
#  4:  160 1600     0  8800  800  3200   160
#  5:    0 4000     0 16000    0  4000   200
#  6: 2500  250  5000 20000 2500  2500   250
#  7: 2400  600 12000  9000 1500  3000   300
#  8: 1750 1050 21000 10500 1750  7000   350
#  9: 2000 1600 12000 30000 2000  8000   400
# 10:  400    0 20000 32000    0  4000   400
# 11: 1000    0 20000 30000 2500 10000   500
# 12:    0    0 30000 25000    0 15000   500