我有重复推荐的数据,每个后续推荐(每个案例)都在它自己的列中。对于每个运行的分析,这些列的数量都可以更改,因此我需要脚本来解释这一点。
然后我需要创建一个新列来计算第一个和第二个/第二个和第三个(等等)列之间的日期差异,并将其作为整数返回。
我几乎所有的方式都在那里,但是当我试图抽象data.frame选择时,我没有在哪里。
for(i in 1:max.reref){
old <- paste(sprintf("reref_%03d",i))
new <- sprintf("reref_%03d",i+1)
colname <- paste("DateDif", i,i+1,sep="")
dataset[,colname] <- as.integer(as.Date(dataset[,c(old)]) - as.Date(dataset[,c(new)]))
}
我已经通过以下方式尝试了最后一行但没有成功:
dataset[,colname] <- as.integer(as.Date(dataset[,old]) - as.Date(dataset[,new]))
dataset[,colname] <- as.integer(as.Date(dataset[,paste(old)]) - as.Date(dataset[,paste(new)]))
dataset[,colname] <- as.integer(as.Date(dataset$old) - as.Date(dataset$new))
没有成功。
问题似乎是当变量(存储列名)输入到列选择器([]或$)时,它将作为列名输出,而不是列本身。
显然有一种方法可以做到这一点,但这不是明显的方法。
**编辑:** 有人要求我添加我的数据的头部,不幸的是它是246变量的宽度和它的敏感数据,所以我将提供与此问题相关的变量的样本。
id_a RefDate1 RefDate2 RefDate3
1 3229.396 2007-09-20 2015-07-12 2000-06-18
2 4579.532 2004-12-06 2000-06-22 2002-02-07
3 917.971 2007-12-05 2012-02-16 2016-04-29
4 4537.704 2007-03-30 2006-09-27 2006-03-28
5 6599.104 2010-06-06 2017-03-31 2015-08-23
另一个问题是max.reref
引用了什么,这是此数据集的引荐数(例如,需要受函数/循环影响的日期列)。
我希望这会有所帮助。
答案 0 :(得分:0)
使用data.table
和dplyr
dataset.dt <- melt(dataset, id.vars = "id_a")
data.diff <- dataset.dt %>%
arrange(id_a, variable) %>%
mutate(diff = difftime(value, lag(value), unit = "days")) %>%
mutate(diff = ifelse(variable == "RefDate1", NA, diff))
dataset.new<- dcast(data.diff, id_a ~ variable, value.var = "diff")
这会产生
id_a RefDate1 RefDate2 RefDate3
917.971 NA 1534.000 1533.9583
3229.396 NA 2852.000 -5502.0000
4537.704 NA -184.000 -182.9583
4579.532 NA -1628.042 595.0417
6599.104 NA 2490.000 -586.0000
原因RefDate1 = NA
是因为我使用了lag(value)
,也就是说我使用RefDate1 - RefDate2
并将差异存储在RefDate2
。然后结果是dcast
以创建上述内容。现在我们可以将它合并到原始数据集,如下所示
dataset.all <- merge(dataset, dataset.new, by = "id_a, suffixes = c(".date", ".diff"))
您可以对此代码进行一些修改,使用lead
代替lag
(请查看!),在这种情况下,您需要将第二个mutate
更改为{{ 1}}。