2016-10-21 74 views
1

我有类似:[R比较当前行的下一行(在同一列)

ISBN Date Quantity 
3457 2004 10 
3457 2004 6 
3457 2004 10 
3457 2005 7 
3457 2005 12 
9885 2013 10 
9885 2013 6 
9855 2013 10 
9885 2014 7 
9885 2014 12 

而且我想:

ISBN Date Quantity Year 
3457 2004 10  1st Year 
3457 2004 6  1st Year 
3457 2004 10  1st Year 
3457 2005 7  2nd Year 
3457 2005 12  2nd Year 
9885 2013 10  1st Year 
9885 2013 6  1st Year 
9855 2013 10  1st Year 
9885 2014 7  2nd Year 
9885 2014 12  2nd Year 

而且我有这样的代码:

df<-df %>% group_by(ISBN) %>% mutate(Year = ifelse(DateYear > DateYear,"1st Year","2nd Year"))

但是我到处都是“第二年”,所以我想在ifelse的比较中我实际上并没有比较“日期”列中的行。我想我必须使用for循环,但是认为这是在R中的其他方式。我怎样才能得到我需要的结果?

+0

我不明白你的标准是'第一年'和'第二年'?为什么2013年回到第一年,2014年回到第二年? – Phil

+0

@Phil请看这里:https://stackoverflow.com/questions/40159194/r-plot-months-for-the-first-2-years – adlisval

回答

1

按在评论中提到的,你应该有更多的情况下,你可以这样做:

library(dplyr) 
library(toOrdinal) 

df %>% 
    group_by(ISBN) %>% 
    mutate(Year = paste(sapply(cumsum(Date != lag(Date, default = 0)), toOrdinal), "Year")) 

对于为例:

# ISBN Date Quantity 
#1 3457 2004  10 
#2 3457 2004  6 
#3 3457 2005  10 
#4 3457 2006  7 
#5 3457 2007  12 
#6 9885 2013  10 
#7 9885 2014  6 
#8 9855 2015  10 
#9 9885 2015  7 
#10 9885 2016  12 

授予:

#Source: local data frame [10 x 4] 
#Groups: ISBN [3] 
# 
# ISBN Date Quantity  Year 
# <int> <int> <int> <chr> 
#1 3457 2004  10 1st Year 
#2 3457 2004  6 1st Year 
#3 3457 2005  10 2nd Year 
#4 3457 2006  7 3rd Year 
#5 3457 2007  12 4th Year 
#6 9885 2013  10 1st Year 
#7 9885 2014  6 2nd Year 
#8 9855 2015  10 1st Year 
#9 9885 2015  7 3rd Year 
#10 9885 2016  12 4th Year 
0

使用windowing logic

library(dplyr) 
library(readr) 

df_foo = read.table(textConnection("ISBN Date Quantity 
3457 2004 10 
3457 2004 6 
3457 2004 10 
3457 2005 7 
3457 2005 12 
9885 2013 10 
9885 2013 6 
9855 2013 10 
9885 2014 7 
9885 2014 12"), header = TRUE, stringsAsFactors = FALSE) 


df_foo %>% 
    group_by(ISBN) %>% 
    arrange(Date) %>% 
    mutate(
    ifelse(
    cumsum(Date != lag(Date, default = first(Date))), 
    "2nd Year", "1st Year" 
    ) 
) 
+0

它很接近,但它给: – adlisval

+0

对不起。这是接近,但它提供了:'ISBN日期数量年 3457 2004年10月1日年 3457 2004年6月1日年 3457 2004年10月1日年 3457 2005年7月第1年 3457 2005年12月1日年 9885 2013 10月1日年 9885 2013 6年第一年 9855 2013 10第一年 9885 2014 7第二年 9885 2014 12第一年'所以在第一次给出正确的结果之后2004> 2003 =“第二年”,它继续到2004年> 2004年=“第一年年“ – adlisval

+0

@adlisval你确定每个ISBN内只有两年的时间吗? – tchakravarty

0

只是为了完整性,因为我个人比较喜欢这样的解决方案,只用基础R,依靠splitlapply达到的效果在这里之一。有效地,它循环使用ISBN的不同值。

# examples data (note possible error on line 8, ISBN==9855) 
dat0 <- read.table(text="ISBN Date Quantity 
3457 2004 10 
3457 2004 6 
3457 2004 10 
3457 2005 7 
3457 2005 12 
9885 2013 10 
9885 2013 6 
9855 2013 10 
9885 2014 7 
9885 2014 12", header=T) 

# treat separately (loop using 'lapply') 
datlist <- split(dat,dat$ISBN) 
datlist <- lapply(datlist, 
    function(x) within(x, Year <- as.numeric(as.factor(Date)))) 

# bind together 
dat <- do.call(rbind, datlist) 
rownames(dat) <- NULL 

输出:

# ISBN Date Quantity Year 
# 1 3457 2004  10 1 
# 2 3457 2004  6 1 
# 3 3457 2004  10 1 
# 4 3457 2005  7 2 
# 5 3457 2005  12 2 
# 6 9855 2013  10 1 
# 7 9885 2013  10 1 
# 8 9885 2013  6 1 
# 9 9885 2014  7 2 
# 10 9885 2014  12 2 

注意,此方法重新排列数据以这样的方式使得行按照ISBN有序集。此外,我没有打扰编码Year1st Year, 2nd Year, ...等,因为我没有真正看到一个价值超越像1, 2, ...更简单的格式。