根据价值的同比变化在R中创建新列

根据价值的同比变化在R中创建新列,r,R,我有一组以R表示的10年捐款数据。美元价值按ID#(赠送礼物的人)和年份分组。并不是每年都有礼物送给每个人。对于每一行,我想指出该行(礼物)是否是第一笔捐款(以前从未赠送过),是否与前一年相同,大于前一年,小于前一年,是否前一年没有礼物(但前一年有礼物)。此外,我想指出,送礼人是否在下一年没有送礼 因此,如果数据如下所示: ID# YEAR GIFT 1 2005 $10 1 2006

我有一组以R表示的10年捐款数据。美元价值按ID#(赠送礼物的人)和年份分组。并不是每年都有礼物送给每个人。对于每一行,我想指出该行(礼物)是否是第一笔捐款(以前从未赠送过),是否与前一年相同,大于前一年,小于前一年,是否前一年没有礼物(但前一年有礼物)。此外,我想指出,送礼人是否在下一年没有送礼

因此,如果数据如下所示:

ID#          YEAR          GIFT
1               2005          $10
1               2006          $5
1               2008          $15
1               2009          $20
1               2010          $20


the result should be:

ID#          YEAR          GIFT          STATUS
1               2005          $10          FIRST
1               2006          $5           LOWER         also    NO NEXT YEAR
1               2008          $15          PREVIOUS GIVER
1               2009          $20          HIGHER
1               2010          $20          SAME

谢谢

使用
dplyr
的解决方案和一个函数来确定结果并使代码更干净。数据:

data <- read.table(text="ID          YEAR          GIFT
1               2005          $10
1               2006          $5
1               2008          $15
1               2009          $20
1               2010          $20", header=TRUE)
既然我们有了我们的功能,我们就必须处理数据。我们将使用dplyr使内容更具可读性

library(dplyr)

result <- data %>% group_by(ID) %>% 
  arrange(YEAR) %>% #We make sure YEAR is sorted ascending
  mutate(gift.num = GIFT %>% gsub("\\$", "", .) %>% as.numeric) %>% #Create a column with the gifts as numbers
  mutate(RESULT = sapply(YEAR, function(y) { 
  #Apply getStatus passing the corresponding arguments to create RESULT
    getStatus(.$YEAR %>% first == y, .$gift.num[which(.$YEAR==y-1)],
              .$gift.num[which(.$YEAR==y)], .$gift.num[which(.$YEAR==y+1)],
              .$YEAR %>% last == y)
  })) %>%
  select(-gift.num) #Removing the dummy column

更多的数据将更好地确保涵盖所有场景,但即使没有,您也应该能够修复任何错误。

如果您的示例是可复制的,在这里描述的意义上,这将是很好的:事实上,不清楚您的列是因子还是字符/字符串。很抱歉,我是新来的(第一个问题)。我愿意将年份设置为字符、数字或因子,以最有效的为准。礼物是数字的,ID#是更可取的因子/字符,但如果需要可以是数字的。请查看
数据开发版本中的
shift
函数。表
(最近有一系列问题,可以给您举个例子)。这将回答你的大部分问题
dt[,first:=.I==1,by=id]
将为您提供第一份礼物的指标(请确保按年份排序),谢谢!这确实让我走上了正确的方向。正如你所说,它需要一些调试与更多的数据,但我真的很感谢你的帮助!
library(dplyr)

result <- data %>% group_by(ID) %>% 
  arrange(YEAR) %>% #We make sure YEAR is sorted ascending
  mutate(gift.num = GIFT %>% gsub("\\$", "", .) %>% as.numeric) %>% #Create a column with the gifts as numbers
  mutate(RESULT = sapply(YEAR, function(y) { 
  #Apply getStatus passing the corresponding arguments to create RESULT
    getStatus(.$YEAR %>% first == y, .$gift.num[which(.$YEAR==y-1)],
              .$gift.num[which(.$YEAR==y)], .$gift.num[which(.$YEAR==y+1)],
              .$YEAR %>% last == y)
  })) %>%
  select(-gift.num) #Removing the dummy column
  ID YEAR GIFT                  RESULT
1  1 2005  $10                   FIRST
2  1 2006   $5 LOWER also NO NEXT YEAR
3  1 2008  $15          PREVIOUS GIVER
4  1 2009  $20                  HIGHER
5  1 2010  $20                    SAME