我有一个数据集,可以追踪数以百万计的公司多年来的收入。这些数据看起来像下面的简化版本:
dat <- data.frame(Company = c("a","b","c","d","e","f"), rev_2001 = c(NA, 20, 10, NA, NA, 10),
rev_2002 = c(10, 50, 20, 30, NA, 0), rev_2003 = c(20, NA, 0, NA, NA, 30), rev_2004 = c(NA, 60, 0, 50, NA, 50), rev_2005 = c(NA, 30, NA, 0, NA, 60))我想要创建一个变量(一个我们可以标记为“closure.year”的新列),它将捕捉到该公司去年的收入与0或NA不同。我在为两件事而挣扎:
。
总之,我想要的最后数据如下:

非常感谢!
发布于 2020-10-23 10:45:57
您可以尝试下面的代码
z <- do.call(cbind,Reduce(`|`,rev(replace(dat,is.na(dat),0)[-1]),accumulate = TRUE))
x <- max.col(z>0,"first")
dat$closure.year <- as.numeric(gsub(".*_","",names(dat[-1])[ncol(dat)-replace(x,x == 1,NA)]))这给
> dat
Company rev_2001 rev_2002 rev_2003 rev_2004 rev_2005 closure.year
1 a NA 10 20 NA NA 2003
2 b 20 50 NA 60 30 NA
3 c 10 20 0 0 NA 2002
4 d NA 30 NA 50 0 2004
5 e NA NA NA NA NA NA
6 f 10 0 30 50 60 NA发布于 2020-10-23 09:47:36
从宽格式转换为长格式如何?
df_long <- gather(df,year,value,rev_2001:rev_2005,factor_key=TRUE)
df_long %>% group_by(Company) %>% top_n(1, value)您需要添加一些更多的逻辑来处理0和NA条件,但是这种方法可能会有所帮助。
https://stackoverflow.com/questions/64497324
复制相似问题