我有下表:
wk Brand Retail_price
1 1 a 1.2
2 2 a 1.3
3 1 c 1.4
4 2 c 1.5
5 1 d 1.6
6 2 d 1.7
我正在尝试获取其他品牌在同一周内的零售价。 我想去:
wk Brand Retail_price Retail_price_a Retail_price_c Retail_price_d
1 1 a 1.2 NA 1.4 1.6
2 2 a 1.3 NA 1.5 1.7
3 1 c 1.4 1.2 NA 1.6
4 2 c 1.5 1.3 NA 1.7
5 1 d 1.6 1.2 1.4 NA
6 2 d 1.7 1.3 1.5 NA
我尝试遍历数据以手动为每个品牌添加列。原来效率很低。
我是R的新手。我正在考虑在python中等效于pd.pivot
的东西,创建一个新的df
,然后将两者合并。
如何在R中做到这一点?有更好的方法吗?
答案 0 :(得分:1)
我认为您需要重塑(从长到宽)和合并的组合。这是使用dplyr
和tidyr
的示例:
# data
x <- data.frame(
wk = c(1L, 2L, 1L, 2L, 1L, 2L),
Brand = c("a", "a", "c", "c", "d", "d"),
Price = c(1.2, 1.3, 1.4, 1.5, 1.6, 1.7),
stringsAsFactors = FALSE)
library(dplyr)
library(tidyr)
x2 <- spread(x, Brand, Price, sep = "_") %>%
left_join(x, by = "wk")
x2
# wk Brand_a Brand_c Brand_d Brand Price
# 1 1 1.2 1.4 1.6 a 1.2
# 2 1 1.2 1.4 1.6 c 1.4
# 3 1 1.2 1.4 1.6 d 1.6
# 4 2 1.3 1.5 1.7 a 1.3
# 5 2 1.3 1.5 1.7 c 1.5
# 6 2 1.3 1.5 1.7 d 1.7
然后,您可以根据需要删除相同品牌的单元格。
在data.table
中:
library(data.table)
xDT <- setDT(copy(x))
merge(xDT, dcast(xDT, wk ~ Brand), by = c("wk"))
# or #
xDT[dcast(xDT, wk ~ Brand), on = c("wk")]