【发布时间】:2019-07-18 21:47:30
【问题描述】:
我有这个df:
df = data.frame(Meaning = c('Tax', 'Internet', 'Tax', 'Phone', 'Tax', 'Car'),
Code = c(4656, 6152, 4656, 6150, 4656, 6151),
Total = c(0.73, 4.4, 1.33, 8, 1.67, 10),
Tax = c(0.73, NA, 1.33, NA, 1.67, NA),
Subtotal = c(NA, 3.67, NA, 6.67, NA, 8.33),
stringsAsFactors = FALSE)
> df
Meaning Code Total Tax Subtotal
Tax 4656 0.73 0.73 NA
Internet 6152 4.40 NA 3.67
Tax 4656 1.33 1.33 NA
Phone 6150 8.00 NA 6.67
Tax 4656 1.67 1.67 NA
Car 6151 10.00 NA 8.33
我想使用reshape() 或stack 来获得另一个data.frame,如下所示:
Code Meaning Category Price
6152 Internet Total 4.4
6152 Internet Subtotal 3.67
4656 Tax Subtotal 0.73
6150 Phone Total 8
6150 Phone Subtotal 6.67
4656 Tax Subtotal 1.33
6151 Car Total 10
6151 Car Subtotal 8.33
4656 Tax Subtotal 1.67
其中Category 显示来自df 的列(Total 或Subtotal)和Price 显示方式如下:Total、Subtotal、Tax 显示在df .
到目前为止,我尝试过:
cbind(df[1:2], stack(lapply(df[-c(1:2)], as.character)))
但它检索:
Meaning Code values ind
Tax 4656 0.73 Total
Internet 6152 4.4 Total
Tax 4656 1.33 Total
Phone 6150 8 Total
Tax 4656 1.67 Total
Car 6151 10 Total
Tax 4656 0.73 Tax
Internet 6152 <NA> Tax
Tax 4656 1.33 Tax
Phone 6150 <NA> Tax
Tax 4656 1.67 Tax
Car 6151 <NA> Tax
Tax 4656 <NA> Subtotal
Internet 6152 3.67 Subtotal
Tax 4656 <NA> Subtotal
Phone 6150 6.67 Subtotal
Tax 4656 <NA> Subtotal
Car 6151 8.33 Subtotal
有什么想法吗?
注意:我已经尝试了所有这些答案,但由于我的df 有一些NA 解决方案不起作用。
Answer 1、Answer 2、Answer 3
【问题讨论】:
-
为什么不使用新的 tidyverse 包
tidyr。这是一份备忘单:link。使用“数据导入备忘单”,p。 2.你要找的函数是spread和gather。 -
也许问题在于您应该只过滤
NA行。