希望你能帮助我的问题。
我的数据集看起来像这样。有 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, exact = exact( 中的错误:下标越界 另外: 警告消息: 在 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
提前感谢!
如果你不介意一个整洁的方法,你可以做这样的事情:
library(tidyverse)
test <- read_delim(file=clipboard(),
col_names=TRUE, delim=",", trim_ws=TRUE) ## copied your 6 lines of data into the clipboard
test %>%
gather(key, value, -item, -index) %>%
unite("names", item, key) %>%
spread(names, value) %>%
mutate_at(vars(ends_with("_price")), as.numeric)
# A tibble: 2 x 9
index apple_price apple_taste banana_price banana_taste orange_price
<dbl> <dbl> <chr> <dbl> <chr> <dbl>
1 1 NA NA 4 medium 3
2 2 4 medium 3 medium 4
# … with 3 more variables: orange_taste <chr>, pier_price <dbl>,
# pier_taste <chr>
">gather"命令创建一个"长"数据帧,其中"key"变量包含存储的信息类型(即口味和价格(,"value"变量包含实际值;由于值的类型不同,因此数值被强制转换为字符。"Unite"将项目描述和信息类型合并到一个新的列"名称"中。"spread"为"names"列的每个值创建一个新列,其中包含相应的值。最后一位 (mutate_at( 将价格转换为数字格式。