从长数据集到宽数据集重新格式化数据集

时间:2019-05-30 10:22:59

标签: r dataset reformat

希望您能解决我的问题。

我的数据集看起来像这样。有1500行。

+-------+---------+---------+--------+
| index |   item  |  taste  |  price |
+-------+---------+---------+--------+
|     1 |  orange |  low    |      3 |
|     1 | banana  |  medium |      4 |
|     1 |  pier   |  high   |      2 |
|     2 | apple   | medium  |      4 |
|     2 |  orange |  medium |      4 |
|     2 |  banana |  medium |      3 |
|   ... | ...     | ...     |    ... |
|  1500 | 1500    |  1500   |   1500 |
+-------+---------+---------+--------+

我使用此代码,但收到错误消息:

library(data.table)

dcast(setDT(df), index ~ item, value.var = c("taste", "price"))

错误提示:

  

.subset2(x,i,确切=精确)中的错误:下标超出范围   另外:警告消息:   在if(!(value.var%in%names(data))){:     条件的长度> 1,并且只会使用第一个元素

这是我想要得到的预期结果。

index, item, taste_orange,taste.banana, taste.pier, taste.apple, price_orange,price.banana, price.pier, price.apple, 
1, low,medium,high,0,3,4,2,0
2, medium,medium,0,medium,4,3,0,4
...,...,...,...,...,...,...,....,...
1500,1500, 1500,1500,1500,1500,1500,1500,1500

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您不介意使用tidyverse方法,则可以执行以下操作:

VLOOKUP(SUBSTITUTE(A2;"*";"~*");Users!A:P;4;FALSE)

“收集”命令创建一个“长”数据帧,其中“键”变量包含存储的信息类型(即口味和价格),“值”变量包含实际值;由于值的类型不同,因此将数值强制转换为字符。 “ unite”合并到新列中,“ names”项说明和信息类型。 “ spread”会为“ names”列的每个值创建一个新列,并带有相应的值。最后一位(mutate_at)将价格转换为数字格式。