在R中将两个数据帧相乘

时间:2018-07-02 11:50:52

标签: r dataframe

我有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

谢谢!

3 个答案:

答案 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)
希望有帮助!