我有2个数据帧,每个数据帧有2列,我想将数据帧1的第2列的每个单元与数据帧2的第2列的每个单元相乘。而且,我希望保留两个数据帧的第1列,因此我知道乘法是在哪个单元格之间。我的数据框看起来像
数据框1:
Text1 Value
ab 5
ak 6
bd 1
数据框2:
Text2 Value
acc 3
fnn 2
我想要这样的输出
Text1 Text2 Value
ab acc 15
ab fnn 10
ak acc 18
ak fnn 12
bd acc 3
bd fnn 2
谢谢!
答案 0 :(得分:1)
使用基本R:
transform(merge(cbind(dat1,id=1),cbind(dat2,id=1),by="id"),value=Value.x*Value.y,Value.x=NULL,Value.y=NULL,id=NULL)
Text1 Text2 value
1 ab acc 15
2 ab fnn 10
3 ak acc 18
4 ak fnn 12
5 bd acc 3
6 bd fnn 2
使用tidyverse
library(tidyverse)
dat1%>%
mutate(id=1)%>%
full_join(dat2%>%mutate(id=1),by="id")%>%
mutate(value=Value.x*Value.y)%>%
select(Text1,Text2,value)
Text1 Text2 value
1 ab acc 15
2 ab fnn 10
3 ak acc 18
4 ak fnn 12
5 bd acc 3
6 bd fnn 2
另一个基本的R选项
cbind(expand.grid(Text2=dat2$Text2,Text1=dat1$Text1),value=c(dat2$Value%o%dat1$Value))
Text2 Text1 value
1 acc ab 15
2 fnn ab 10
3 acc ak 18
4 fnn ak 12
5 acc bd 3
6 fnn bd 2
答案 1 :(得分:1)
这里是data.table
library(data.table)
CJ(Text1 = df1[,1], Text2 = df2[,1])[, Value := c(outer(df2[,2], df1[,2]))][]
# Text1 Text2 Value
#1: ab acc 15
#2: ab fnn 10
#3: ak acc 18
#4: ak fnn 12
#5: bd acc 3
#6: bd fnn 2
如果列名不是问题,可以使上面的内容更紧凑
CJ(df1[,1], df2[,1])[, value := c(df2[,2] %o% df1[,2])][]
或使用tidyverse
library(tidyverse)
df1 %>%
mutate(new = list(df2)) %>%
unnest %>%
transmute(Text1, Text2, value = Value * Value1)
# Text1 Text2 value
#1 ab acc 15
#2 ab fnn 10
#3 ak acc 18
#4 ak fnn 12
#5 bd acc 3
#6 bd fnn 2
答案 2 :(得分:0)
如果您的数据框保持与您提到的结构相同,则以下功能应为您解决问题。
df_multiply<-function(data1,data2){
Text1<-Text2<-Value<-vector()
for(i in 1:nrow(data1)){
val1<-data1[[2]][i]
for(j in 1:nrow(data2)){
Text1<-c(Text1,as.character(data1[[1]][i]))
Text2<-c(Text2,as.character(data2[[1]][j]))
val2<-val1 * data2[[2]][j]
Value<-c(Value,val2)
}
}
res<-data.frame("Text1" = Text1,"Text2" = Text2,"Value" = Value)
return(res)
}
要使用该功能,只需使用数据框的名称作为输入参数。
例如,df_multiply(data1 = dataframe1,data2 = dataframe2)
希望有帮助!