我想在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中的所有其他列值一起添加
答案 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