将2个数据帧的不同大小的列相乘 [英] Multiplying columns of different size of 2 data frames

查看:0
本文介绍了将2个数据帧的不同大小的列相乘的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在R中有两个不同的数据框。第一个df1包含许多城市的数据,每个城市都与其对应的州相关联。第二个包含按州聚合的数据,但将这些数据分成多个类。如下所示:

states1 <- c("a", "a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "d", "d", "d")
cities <- c("A","B","C","D","E","F","G","H","I","J","K","L","M","N")
data1 <- c(123, 222, 444, 125, 687, 987, 556, 445, 444, 659, 798, 113, 325, 144) 
df1 <- data.frame(states1, cities, data1)
#
states2 <- c("a","a","b","b","c","c","d","d")
classes <- c(1,2,1,2,1,2,1,2)
data2 <- c(65,21,44,25,37,87,58,47)
df2 <- data.frame(states2, classes, data2)

我想根据某个条件将两个数据框中的数据列相乘,以创建第三个数据框。对于每个城市,我希望将其数据乘以其对应的州的数据,创建两列,每个类一列。

例如:

对于属于州a的城市A和城市B,以及属于州c的城市K,我需要将它们的数据乘以它们各自的州的数据,然后对类1和类2执行此操作。也就是说,我希望使用相应的州作为匹配条件将城市的数据乘以两个类的数据。就像这样,例如:

multA <- c(123*65, 123*21)
multB <- c(222*65, 222*21)
multK <- c(798*37, 789*87)

df3 <- data.frame(rbind(multA, multB, multK))
colnames(df3) <- c("class 1", "class 2")

但当然,我希望自动为每个城市这样做。我已经尝试使用which函数和dplyr包,但到目前为止我还没有想出解决方案。有没有什么方法可以在不使用包或内置函数、不需要编写显式循环的情况下做到这一点?谢谢!!

推荐答案

要在注释中扩展@Frank的基本R解决方案,请考虑df2reshape,然后merge数字列的乘积transform的两个集合:

# RESHAPE LONG TO WIDE
rdf2 <- reshape(df2, idvar="states2", v.names="data2", timevar="classes", direction="wide")
# RENAME COLUMNS
rdf2 <- setNames(rdf2, c("states2", "class1", "class2"))

# MERGE AND TRANSFORM            
final_df <- transform(merge(df1, rdf2, by.x="states1", by.y="states2"),
                      class1 = data1 * class1,
                      class2 = data1 * class2)

final_df

#    states1 cities data1 class1 class2
# 1        a      A   123   7995   2583
# 2        a      B   222  14430   4662
# 3        a      C   444  28860   9324
# 4        a      D   125   8125   2625
# 5        a      E   687  44655  14427
# 6        b      F   987  43428  24675
# 7        b      G   556  24464  13900
# 8        b      H   445  19580  11125
# 9        b      I   444  19536  11100
# 10       c      J   659  24383  57333
# 11       c      K   798  29526  69426
# 12       d      L   113   6554   5311
# 13       d      M   325  18850  15275
# 14       d      N   144   8352   6768

这篇关于将2个数据帧的不同大小的列相乘的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆