【问题标题】:Accessing data frame columns from within a loop in R从 R 中的循环内访问数据框列
【发布时间】:2017-05-23 11:47:23
【问题描述】:

我有关于重复推荐的数据,每个后续推荐(每个案例)都在它自己的列中。这些列的数量会随着每次运行的分析而改变,所以我需要脚本来解决这个问题。

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

我几乎已经完成了所有的工作,但是当我尝试抽象 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 指的是什么,这是此数据集的引用数(例如需要受函数/循环影响的日期列)。

我希望这会有所帮助。

【问题讨论】:

  • 请同时添加head(dataset)
  • 另外请提供max.reref
  • 您使用的是 data.table 包中的 data.tables 吗?您对这个软件包的评估是正确的。在这种情况下,您需要在每个 dataset[...] 调用中添加 with=FALSE 参数。

标签: r calculated-columns abstraction


【解决方案1】:

使用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。然后结果是dcasted 来创建上面的。现在我们可以将其合并到原始数据集,如下所示

dataset.all <- merge(dataset, dataset.new, by = "id_a, suffixes = c(".date", ".diff"))

您可以对此代码进行的一些修改是使用lead 而不是lag(检查一下!),在这种情况下,您需要将第二个mutate 更改为RefDate___

【讨论】:

  • 通常这部分代码是在 dcast 之后出现的,所以我已经返回并将其放入前面的部分。不过谢谢你,这是一种享受。
  • 如果这是您正在寻找的解决方案,您介意投票吗?谢谢
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 2018-08-28
相关资源
最近更新 更多