将2个数据帧的不同大小的列相乘 [英] Multiplying columns of different size of 2 data frames
本文介绍了将2个数据帧的不同大小的列相乘的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
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解决方案,请考虑df2的reshape
,然后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屋!
查看全文