有没有办法在 R 中循环复制值?

Is there a way to loop copying values in R?

我正在为我的硕士论文处理一个非常混乱的数据集,我需要一些帮助来将值从一列复制到其他列。

我需要做的是:

  1. 我需要将第 1 行的值复制到同一行的 price_close 列。
  2. 我需要将第 2 行的值复制到第 1 行的 price_high 列
  3. 我需要将第 3 行的值复制到第 1 行的 price_low 列
  4. 我需要将第 4 行的值复制到第 1 行的 price_open 列
  5. 我需要将第 5 行的值复制到第 1 行的 shares_outstanding 列

所有公司和所有日期都需要这样做。因此,我需要为下一家公司做同样的程序。含义:

  1. 我需要将第 5 行的值复制到同一行的 price_close 列。
  2. 我需要将 row+6 中的值复制到 row+5
  3. 中的 price_high 列
  4. 我需要将 row+7 中的值复制到 row+5
  5. 中的列 price_low
  6. 我需要将 row+8 中的值复制到 row+5
  7. 中的列 price_open
  8. 我需要将 row+9 中的值复制到 row+5
  9. 中的列 shares_outstanding

数据集太大,无法手动执行此操作。但是,我想这可以在 R 中使用循环,因为“复制”在整个数据集中遵循相同的模式。如果是这样的话,我真的很感激一些指导来解决这个问题。谢谢!

在附图中,你可以看到我的数据是什么样子的。

您所描述的是将数据从“长格式转换为宽格式”。搜索该短语将在 R 中找到很多方法来完成此操作。这是一个,您可以使用 tidyr 中的 pivot_wider(),如下所示:

(根据@Axeman 的建议编辑为使用 separate()

library(dplyr)
library(tidyr)
df %>%
  separate(col = "variable", into = c("company", "metric"), sep = " - ") %>%
  pivot_wider(id_cols = c("company", "date"), names_from = "metric", values_from = "value")
#>     company       date Price Close High Price Price Low Opening price
#> 1 Company 1 2022-01-01         5.5        6.0       5.0           5.0
#> 2 Company 2 2022-01-01         3.5        7.0       8.0           1.0
#> 3 Company 1 2022-01-02         5.4        5.9       4.9           4.8
#>   Common Shares Outstanding
#> 1                      1000
#> 2                      5000
#> 3                      1000

数据:

df <- data.frame(variable = c("Company 1 - Price Close",
                              "Company 1 - High Price",
                              "Company 1 - Price Low",
                              "Company 1 - Opening price",
                              "Company 1 - Common Shares Outstanding",
                              "Company 2 - Price Close",
                              "Company 2 - High Price",
                              "Company 2 - Price Low",
                              "Company 2 - Opening price",
                              "Company 2 - Common Shares Outstanding",
                              "Company 1 - Price Close",
                              "Company 1 - High Price",
                              "Company 1 - Price Low",
                              "Company 1 - Opening price",
                              "Company 1 - Common Shares Outstanding"),
                 date = c(rep("2022-01-01", 10), rep("2022-01-02", 5)),
                 value = c(5.5, 6, 5, 5, 1000,
                           3.5, 7, 8, 1, 5000,
                           5.4, 5.9, 4.9, 4.8, 1000))

由 reprex 包 (v2.0.1) 创建于 2022-05-23