R 将列中的值与其他列相乘
我是R.的新手。R 将列中的值与其他列相乘,r,R,我是R.的新手。 我想将数据帧的列相乘。这类问题必须是非常基本的,但我是R的新手。我有输入数据 Id Name quantity Id1 Name1 200 Id2 Name2 300 Id3 Name3 500 Id4 Name4 400 Name BonusMultiplier Name1 1 Name2 2 Name3 3 Name4 2 Date Name1 Name2 Name3
我想将数据帧的列相乘。这类问题必须是非常基本的,但我是R的新手。我有输入数据
Id Name quantity
Id1 Name1 200
Id2 Name2 300
Id3 Name3 500
Id4 Name4 400
Name BonusMultiplier
Name1 1
Name2 2
Name3 3
Name4 2
Date Name1 Name2 Name3 Name4
12/3/2014 20.5 200.3 56.3 550.6
12/2/2014 21.5 180.3 60.5 556.2
12/1/2014 19.6 190.0 61.6 559.6
11/30/2014 15.6 195.6 62.6 580.8
我想要的输出应该是
Date Name1 Name2 Name3 Name4
12/3/2014 20.5*200*1 200.3*300*2 56.3*500*3 550.6*400*2
12/2/2014 21.5*200*1 180.3*300*2 60.5*500*3 556.2*400*2
12/1/2014 19.6*200*1 190.0*300*2 61.6*500*3 559.6*400*2
11/30/2014 15.6*200*1 195.6*300*2 62.6*500*3 580.8*400*2
编辑如果输出是这样的呢
Date Id1 Id2 Id3 Id4
12/3/2014 20.5*200*1 200.3*300*2 56.3*500*3 550.6*400*2
12/2/2014 21.5*200*1 180.3*300*2 60.5*500*3 556.2*400*2
12/1/2014 19.6*200*1 190.0*300*2 61.6*500*3 559.6*400*2
11/30/2014 15.6*200*1 195.6*300*2 62.6*500*3 580.8*400*2
您可以尝试
Map
(假设数据集已排序)
数据
df1您可以尝试Map
(假设数据集已排序)
数据
df1我的版本
require(reshape2)
#create data
m1 <- data.frame(Id=paste0("Id", seq(1,4)), Name=paste0("Name", seq(1,4)),
quantity=c(2, 3, 5, 4)*100)
m2 <- data.frame(Name=paste0("Name", seq(1,4)), BonusMultiplier=c(1, 2, 3, 2))
m3 <- data.frame(rbind(c("12/3/2014", 20.5, 200.3, 56.3, 550.6),
c("12/2/2014", 21.5, 180.3, 60.5, 556.2),
c("12/1/2014", 19.6, 190.0, 61.6, 559.6),
c("11/30/2014", 15.6, 195.6, 62.6, 580.8)))
names(m3) <- c("Date", "Name1", "Name2", "Name3", "Name4")
#do the work
m.melt <- melt(m3, id.vars="Date", variable.name="Name", value.name="Value")
m.all <- merge(merge(m.melt, m1), m2)
m.all <- within(m.all,
answer <- paste(Value, quantity, BonusMultiplier, sep="*"))
dcast(m.all, Date ~ Name)
我的版本
require(reshape2)
#create data
m1 <- data.frame(Id=paste0("Id", seq(1,4)), Name=paste0("Name", seq(1,4)),
quantity=c(2, 3, 5, 4)*100)
m2 <- data.frame(Name=paste0("Name", seq(1,4)), BonusMultiplier=c(1, 2, 3, 2))
m3 <- data.frame(rbind(c("12/3/2014", 20.5, 200.3, 56.3, 550.6),
c("12/2/2014", 21.5, 180.3, 60.5, 556.2),
c("12/1/2014", 19.6, 190.0, 61.6, 559.6),
c("11/30/2014", 15.6, 195.6, 62.6, 580.8)))
names(m3) <- c("Date", "Name1", "Name2", "Name3", "Name4")
#do the work
m.melt <- melt(m3, id.vars="Date", variable.name="Name", value.name="Value")
m.all <- merge(merge(m.melt, m1), m2)
m.all <- within(m.all,
answer <- paste(Value, quantity, BonusMultiplier, sep="*"))
dcast(m.all, Date ~ Name)
#以下是一个简单的解决方案:
#步骤1:根据“名称”对三个数据帧进行排序。
df1.1#以下是一个简单的解决方案:
#步骤1:根据“名称”对三个数据帧进行排序。
感谢您的回复。但它不起作用(.它说的是空值。我正在检查。似乎您的解决方案是正确的。我还更新了问题。请看一看。@ChaturvediDewashish,您只需添加一行colnames(df3)[-1],谢谢您的回答。但它不起作用。:(.它说的是空值。我正在检查。似乎您的解决方案是正确的。我还更新了问题。请看一看。@ChaturvediDewashish,您只需添加一行colnames(df3)[-1]太好了,我也会这样做,但我想Chaturvedi的意思是自己进行计算回答我想我是一个所见即所得的人;这就是他展示的;)是的,你替换答案将有助于他获得计算结果。太好了,我也会这样做,但我认为查图维迪的意思是自己进行计算答案我想我是一个所见即所得的人;他毕竟展示了这一点;)是的,你替换答案将有助于他获得计算结果。
df1 <- tructure(list(Id = 1:4, Name = c("Name1", "Name2", "Name3",
"Name4"), quantity = c(200L, 300L, 500L, 400L)), .Names = c("Id",
"Name", "quantity"), class = "data.frame", row.names = c(NA, -4L))
df2 <- structure(list(Name = c("Name1", "Name2", "Name3", "Name4"),
BonusMultiplier = c(1L, 2L, 3L, 2L)), .Names = c("Name",
"BonusMultiplier"), class = "data.frame", row.names = c(NA, -4L))
df3 <- structure(list(Date = c("12/3/2014", "12/2/2014", "12/1/2014",
"11/30/2014"), Name1 = c(20.5, 21.5, 19.6, 15.6), Name2 = c(200.3,
180.3, 190, 195.6), Name3 = c(56.3, 60.5, 61.6, 62.6), Name4 = c(550.6,
556.2, 559.6, 580.8)), .Names = c("Date", "Name1", "Name2", "Name3",
"Name4"), class = "data.frame", row.names = c(NA, -4L))
require(reshape2)
#create data
m1 <- data.frame(Id=paste0("Id", seq(1,4)), Name=paste0("Name", seq(1,4)),
quantity=c(2, 3, 5, 4)*100)
m2 <- data.frame(Name=paste0("Name", seq(1,4)), BonusMultiplier=c(1, 2, 3, 2))
m3 <- data.frame(rbind(c("12/3/2014", 20.5, 200.3, 56.3, 550.6),
c("12/2/2014", 21.5, 180.3, 60.5, 556.2),
c("12/1/2014", 19.6, 190.0, 61.6, 559.6),
c("11/30/2014", 15.6, 195.6, 62.6, 580.8)))
names(m3) <- c("Date", "Name1", "Name2", "Name3", "Name4")
#do the work
m.melt <- melt(m3, id.vars="Date", variable.name="Name", value.name="Value")
m.all <- merge(merge(m.melt, m1), m2)
m.all <- within(m.all,
answer <- paste(Value, quantity, BonusMultiplier, sep="*"))
dcast(m.all, Date ~ Name)
Date Name1 Name2 Name3 Name4
1 11/30/2014 15.6*200*1 195.6*300*2 62.6*500*3 580.8*400*2
2 12/1/2014 19.6*200*1 190*300*2 61.6*500*3 559.6*400*2
3 12/2/2014 21.5*200*1 180.3*300*2 60.5*500*3 556.2*400*2
4 12/3/2014 20.5*200*1 200.3*300*2 56.3*500*3 550.6*400*2
#Here is a simple solution:
# Step 1: sort the three data frames according to 'Name'.
df1.1 <- df1[order(df1$Name), ]
df2.1 <- df2[order(df2$Name), ]
df3.1 <- df3[, c("Date", order(names(df3)[-1]))]
# Step 2: define a new data.frame named df3.2 to store the output
df3.2 <- data.frame(matrix(NA, ncol=ncol(df3.1), nrow=nrow(df3.1)))
df3.2[, 1] <- df3.1[, 1]
names(df3.2) <- names(df3.1)
# Step 3. run a for-loop to calculate for each column of df3.1
for(i in 1:(ncol(df3.1)-1))
{
j <- i+1
df3.2[, j] <- df3.1[, j] * df1.1[i, "quantity"] * df2.1[i, "BonusMultiplier"]
}
head(df3.2)