从R

时间:2017-05-23 11:47:23

标签: r calculated-columns abstraction

我有重复推荐的数据,每个后续推荐(每个案例)都在它自己的列中。对于每个运行的分析,这些列的数量都可以更改,因此我需要脚本来解释这一点。

然后我需要创建一个新列来计算第一个和第二个/第二个和第三个(等等)列之间的日期差异,并将其作为整数返回。

我几乎所有的方式都在那里,但是当我试图抽象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引用了什么,这是此数据集的引荐数(例如,需要受函数/循环影响的日期列)。

我希望这会有所帮助。

1 个答案:

答案 0 :(得分:0)

使用data.tabledplyr

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}}。