将行中的数据添加到R中的列

时间:2019-08-05 21:31:20

标签: r

我有下表:

     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中做到这一点?有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我认为您需要重塑(从长到宽)和合并的组合。这是使用dplyrtidyr的示例:

# 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")]