从R循环中的现有列创建新列?

cyvaqqii  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(163)

在一个dataframe中,我有一组列,我想为它们创建一组新的列。具体来说,从第4列到第8列和第11列到第13列,我希望创建新列,这些列是这些列的滞后版本。
在不应用for循环的情况下,对于每个单独的列,我的滞后代码看起来像这样:df$FIREmob_l1 <- lag(df$FIREmob, 50L)
但是,我想应用一个循环,以便通过将lag(df$"colname", 50L)应用于第5至8列和第11至13列来创建新列“colname”_l1。
我的两个主要问题:
1.我如何在循环中指定我只希望循环在 Dataframe 中的特定列上运行?
1.我如何表示我希望为每个名为“'colname'_1L”的变量创建一个新变量?
谢谢!
我都不知道该从何开始。

kknvjkwl

kknvjkwl1#

你没有提供一个工作示例,所以我不能测试它,但我认为这就是你想要的:

# Use apply to efficiently loop over the columns.
# Just supply the loop with the columns you are interested in.
lagged.columns = apply(df[, c(4:8, 11:13)], 2, lag, 50L)

如果您想将滞后列添加到原始data.frame中,只需使用cbind即可。

df = cbind(df, lagged.columns)
bwntbbo3

bwntbbo32#

dplyr提供了一种非常简单的方法来完成此任务

library(dplyr)
new_df <- df |>
  mutate( 
    across(c(col4:col8, col11:col15), # replace with the names of your actual columns
      list(
        l1 = ~lag(.x, 50L)
      )
  )

具体回答你的两个问题:
across函数需要两个参数。(1)第一个是要应用函数的列名向量。在这里,我将它们指定为col4:col8col11:col13,但是您需要用实际的列名来替换它们。
(2)第二个是函数或函数列表。在这里,我们使用一个大小为1的列表来指定需要创建新变量而不是覆盖原始变量。默认情况下(我们在这里很幸运),它使用格式"{.col}_{.fn}",其中.col是列名,.fn是函数名,所以通过命名函数l1,您可以得到您想要的。如果你想做其他事情,你可以给across添加另一个参数:.name,在这里指定如何将列名和函数名包含到新变量名中(例如.name = "{.fn}_{.col}"将给予相反的顺序)。
如果您不熟悉管道操作符(|>),则等效的表示为

library(dplyr)
new_df <- mutate(df, 
    across(c(col4:col8, col11:col15), # replace with the names of your actual columns
      list(
        l1 = ~lag(.x, 50L)
      )
  )

相关问题