R(dplyr):相对于列表中第一个值的值的总和列表

时间:2016-02-25 21:24:52

标签: r dplyr

在下面的DATA表格中,我列出了属于三个组ABC的数字列表。我需要创建另一列NAYSA,其中包含相对于组中第一个数字的两个数字的总和。并非所有组在我的数据集中都有多个数字。希望RESULT表说明我需要做什么。

请注意,NAYSA列中每个组的第一行与YRS表中的DATA列中的第一行相同。但是,NAYSA列中的第3行是YRS列中第2行和第3行的值的总和。同样,NAYSA中的第5行和第6行是第4行和第5行的值之和。分别在YRS列中的4和6。

我更喜欢使用dplyr的解决方案,但我愿意接受其他建议。提前谢谢。

DATA = data.frame(IND = c("A","B","B","C","C","C"), 
                  YRS = c("1","10","20","100","1","10"))

RESULT = data.frame(IND = c("A","B","B","C","C","C"), 
                    YRS = c("1","10","20","100","1","10"), 
                    NAYSA = c(1, 10, 30, 100, 101, 110))

2 个答案:

答案 0 :(得分:2)

编辑以匹配所需的输出,您可以使用mutate,如下所示:

DATA$YRS <- as.integer(as.character(DATA$YRS))
DATA %>% group_by(IND) %>% mutate(NAYSA = ifelse(row_number() == 1, YRS, YRS + YRS[1]))
Source: local data frame [6 x 3]
Groups: IND [3]

     IND   YRS NAYSA
  (fctr) (int) (int)
1      A     1     1
2      B    10    10
3      B    20    30
4      C   100   100
5      C     1   101
6      C    10   111

BTW - 我必须先将YRS转换为整数,因为您在数据集中创建了该列作为字符向量。当然,如果此列中的原始数据已经是数字格式,则不需要此步骤。

答案 1 :(得分:1)

dplyr解决方案符合您的预期结果:

library(dplyr)
RESULT <- DATA  %>%
  # set the grouping factor 
  group_by(IND) %>%
  # convert YRS to numeric and generate new variable by adding the
  # first value on the YRS column to YRS on the current row, unless
  # we are on the first row, in that case just keep the current value 
  # of YRS 
  mutate(YRS = as.numeric(as.character(YRS)),
         NAYSA = ifelse(row_number() == 1, YRS, first(YRS) + YRS))

> RESULT
Source: local data frame [6 x 3]
Groups: IND [3]

      IND   YRS NAYSA
  (fctr) (dbl) (dbl)
1      A     1     1
2      B    10    10
3      B    20    30
4      C   100   100
5      C     1   101
6      C    10   110

此解决方案的一个警告是,它与您预期结果中的数据类型不匹配,但我不确定您示例中的数据类型是否符合您的要求。

我意识到这个答案与@Gopala提供的答案非常相似,但我认为使用first而不是索引会使代码更清晰,而且,我使用as.numeric代替{{1因为我觉得这是一种更通用的方法。

我希望你觉得这个解决方案很有用。