不同行中的值之间的差异

时间:2017-12-01 04:06:30

标签: r dplyr

我试图使用dplyr从同一组中另一行的值中减去特定组中的值。

例如,采用以下数据框

df <- data.frame(Letter = c("a","b", "b", "a","b","b"), 
                 value = c("1","2","2","6","7","10"), 
                 year =c("2001", "2001", "2001", "2005", "2005", "2005"))

我试图将2001和2005作为一个单独的组,并用“a”的值减去“b”的值

这样我最终会得到

  Letter value year dvalue
1      a     1 2001      0
2      b     2 2001      1
3      b     2 2001      1
4      a     6 2005      0
5      b     7 2005      1
6      b    10 2005      4

我尝试使用dplyr和mutate

data <- data %>% dplyr::group_by(year) %>%
        dplyr::mutate(dvalue = value[Letter == "a"] - value[Letter == "b"])

并引发以下错误

  

mutate_impl(.data,dots)中的错误:列dvalue必须是长度   3(组大小)或1,而不是2

2 个答案:

答案 0 :(得分:1)

以防您使用data.table接受答案

dt <- data.table(Letter = c("a","b", "b", "a","b","b"), 
                  value = c(1,2,2,6,7,10), 
                  year =c("2001", "2001", "2001", "2005", "2005", "2005"))

dt[, dvalue := value - .SD[Letter == "a"]$value,by=list(year)]

   Letter value year dvalue
1:      a     1 2001      0
2:      b     2 2001      1
3:      b     2 2001      1
4:      a     6 2005      0
5:      b     7 2005      1
6:      b    10 2005      4

答案 1 :(得分:0)

valueyear列转换为数字后,我们可以使用mutatevalue列中删除a的每个value每个小组。

library(dplyr)
df %>%
  group_by(year) %>%
  mutate(dvalue = value - value[Letter == "a"])


#  Letter value  year dvalue
#   <fctr> <dbl> <dbl>  <dbl>
#1      a     1  2001      0
#2      b     2  2001      1
#3      b     2  2001      1
#4      a     6  2005      0
#5      b     7  2005      1
#6      b    10  2005      4

注意:假设每组只有一个a值。