【发布时间】:2017-04-26 06:53:44
【问题描述】:
我想按组计算差异。虽然我在 SO 上提到了R: Function “diff” over various groups 线程,但由于未知原因,我无法找到区别。我尝试了三种方法:a) spread b) dplyr::mutate 和 base::diff() c) data.table 和 base::diff()。虽然 a) 有效,但我不确定如何使用 b) 和 c) 解决这个问题。
数据说明:
我有该产品的年收入数据。我将 >= 2013 年归类为周期 2(称为 P2),将年份 P1)。
样本数据:
dput(Test_File)
structure(list(Ship_Date = c(2010, 2010, 2012, 2012, 2012, 2012,
2017, 2017, 2017, 2016, 2016, 2016, 2011, 2017), Name = c("Apple",
"Apple", "Banana", "Banana", "Banana", "Banana", "Apple", "Apple",
"Apple", "Banana", "Banana", "Banana", "Mango", "Pineapple"),
Revenue = c(5, 10, 13, 14, 15, 16, 25, 25, 25, 1, 2, 4, 5,
7)), .Names = c("Ship_Date", "Name", "Revenue"), row.names = c(NA,
14L), class = "data.frame")
预期输出
dput(Diff_Table)
structure(list(Name = c("Apple", "Banana", "Mango", "Pineapple"
), P1 = c(15, 58, 5, NA), P2 = c(75, 7, NA, 7), Diff = c(60,
-51, NA, NA)), .Names = c("Name", "P1", "P2", "Diff"), class = "data.frame", row.names = c(NA,
-4L))
这是我的代码:
方法一:使用spread [有效]
data.table::setDT(Test_File)
cutoff<-2013
Test_File[Test_File$Ship_Date>=cutoff,"Ship_Period"]<-"P2"
Test_File[Test_File$Ship_Date<cutoff,"Ship_Period"]<-"P1"
Diff_Table<- Test_File %>%
dplyr::group_by(Ship_Period,Name) %>%
dplyr::mutate(Revenue = sum(Revenue)) %>%
dplyr::select(Ship_Period, Name,Revenue) %>%
dplyr::ungroup() %>%
dplyr::distinct() %>%
tidyr::spread(key = Ship_Period,value = Revenue) %>%
dplyr::mutate(Diff = `P2` - `P1`)
方法2:使用dplyr [不起作用:在Diff 列中生成NA。]
Diff_Table<- Test_File %>%
dplyr::group_by(Ship_Period,Name) %>%
dplyr::mutate(Revenue = sum(Revenue)) %>%
dplyr::select(Ship_Period, Name,Revenue) %>%
dplyr::ungroup() %>%
dplyr::distinct() %>%
dplyr::arrange(Name,Ship_Period, Revenue) %>%
dplyr::group_by(Ship_Period,Name) %>%
dplyr::mutate(Diff = diff(Revenue))
方法 3:使用data.table [不起作用:它在Diff 列中生成全零。]
Test_File[,Revenue1 := sum(Revenue),by=c("Ship_Period","Name")]
Diff_Table<-Test_File[,.(Diff = diff(Revenue1)),by=c("Ship_Period","Name")]
问题:有人可以帮我解决上面的方法 2 和方法 3 吗?我对 R 很陌生,所以如果我的工作听起来太基础,我深表歉意。我还在学习这门语言。
【问题讨论】:
-
对于
Pineapple的P1的值应该是NA吗? -
是的,如果不存在的话。
-
这是否意味着接受的答案给出了错误的结果?
-
@Jogo - 很好的观察!我不会认为 akrun 的答案是错误的,因为
NA-number=NA和number-NA=NA。所以,我相信这并不重要。我创建了这些条目以确保当P1或P2之一丢失时代码不会崩溃。这有帮助吗?
标签: r data.table dplyr