Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将列中的值与其他列相乘_R - Fatal编程技术网

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.的新手。
我想将数据帧的列相乘。这类问题必须是非常基本的,但我是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)