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

用数据帧R中行的最后一列的最后一个值添加每一列,r,dataframe,R,Dataframe,我想将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

我想将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
我试着用lappy

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

但是它需要行值,因此如何让每一行最后一列值或任何特定列与R中的所有其他列值相加不清楚您是否要乘或除(您的要求和您自己的尝试之间似乎存在矛盾),但这里有一种乘法方法:

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

基本思想是将除最后一列之外的所有列乘以最后一列中的值。由于该列已被删除,您可以使用dplyr并假设您的数据帧为df:

library(dplyr)

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

为了完成图片,您还可以使用
data.table
package通过引用更新数据

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

下面是另一个基本R选项:

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

n我也在尝试这个。在
DT之后,我想也是这样,由于保存了
$
部分,您的版本会更快。我只想一步到位,很好。这就是我想要的do@akrun,“几乎相似”意味着它不一样。从我的观点来看,主要区别在于我避免使用
cbind
@akrun,主要区别不是
cbind
,而是他正在动态更新
df
,而不是在全球环境中创建一些新的数据集。有点让我想起了
数据中引用更新背后的逻辑。表
我猜这与我的答案相似,但似乎讨论中缺少了一条注释。这是我将在自己的代码中使用的一种技术,但不确定我会多久向似乎对R没有经验的用户推荐一次。我可以很容易地看到“我的原始数据到哪里去了?”类型的问题。不管怎样,有选择总是很好的。@AnandaMahto,我同意可能会有后续问题,但在这种情况下,我认为OP是一个“软件开发人员”,至少不是第一次使用它,所以似乎对编程有一些了解,其次,我认为学习即使是问后续问题,这将非常有用,因为通过这种方式,他可以了解像您这样更有经验的R用户实际上是如何处理这个问题的。最后但并非最不重要的是,我同意有不同的选择是很好的,这也是我发布这个答案的另一个原因。