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