用数据帧R中行的最后一列的最后一个值添加每一列
我想将dataframe的每一列与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
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用户实际上是如何处理这个问题的。最后但并非最不重要的是,我同意有不同的选择是很好的,这也是我发布这个答案的另一个原因。