【问题标题】:For loop that creates a new variable in a dataframe, run over multiple dataframes in R对于在数据帧中创建新变量的循环,在 R 中运行多个数据帧
【发布时间】:2021-09-10 21:44:39
【问题描述】:

大家好 - 我正在尝试运行一个 for 循环,该循环基于 R 中多个数据帧的向量(按观察 ID 拆分)的某些条件创建一个新变量,但遇到了一些问题。

Dat_nations <- split(Dat, Dat$newccode)

^这将创建我的 143 个数据帧的向量,按国家/地区代码分组。我想应用于每个国家数据框的 for 循环是:

for (i in 1:(length(df1$timeafter)
                    -1){
  df1$timeafter[i+1] <- (df1$newdate[i+1]-df1$newdate[i])  
}

本质上,我正在创建一个新变量,用于计算在特定国家/地区内的先前观察之后的观察天数(它们按日期排列)。但我不知道如何迭代地在所有数据帧上运行它,修改每个数据帧,然后将它们重新组合在一起。

非常感谢!

【问题讨论】:

标签: r dataframe loops


【解决方案1】:

一般来说,处理帧列表的规范方法是使用lapply,尽管for 循环当然可以工作;有关“框架列表”的几个讨论,请参见 https://stackoverflow.com/a/24376207/3358227

注意:length(df)列数,而不是行数。 (此外,如果以编程方式使用1:length(x) 可能是一个错误:如果由于某种原因参数x 的长度为0,那么人们希望/期望它返回一个长度为0 的向量,但它却返回1:0 aka c(1, 0)。要更安全地遍历列,请使用seq_along(x);要安全地遍历行,请使用seq_len(nrow(x))

我认为你可以做你需要的:

lapply(Dat_nations, function(dat) {
  dat$timeafter <- c(NA, diff(dat$newdate))
  dat
})

顺便说一句,如果您打算将其组合回单个帧(出于多种原因),则可以在没有 split 的情况下完成此操作(并且可能更快):

Dat$timeafter <- ave(Dat$newdate, Dat$newccode, FUN = function(z) c(NA, diff(z)))

最后一点:当z 属于DatePOSIXt 类时,diff(z) 将返回一个类difftime 的编号。这意味着它不会在控制台上显示3,而是显示Time difference of 3 days。虽然它看起来像一个字符串,但它仍然是一个数字……dput(diff(Sys.Date()+c(0,3)))+10(差值加 10)仍然有效。 但是,单位可能会发生变化(尤其是 POSIXt),这会造成干扰。解决这个问题的一种简单方法是用类似的东西强制它

diff(Sys.Date() + c(0, 3))
# Time difference of 3 days
as.numeric(diff(Sys.Date() + c(0, 3)), units = "days")
# [1] 3
as.numeric(diff(Sys.Date() + c(0, 3)), units = "hours")
# [1] 72

【讨论】:

  • 超级有帮助!最后一个问题:当我运行 ave 命令时,我收到来自 R 的以下错误:``` as.Date.default(value) 中的错误:不知道如何将“值”转换为“日期”类 ```这当然是关于变量的“日期”分类,但它似乎无法超越它并实际进行计算。奇怪的是,当我使用 lapply 时它工作正常。
  • 我不知道那个错误,我需要“看到”它的实际效果,tbh。
猜你喜欢
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 2020-02-12
  • 2016-04-22
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多