有没有办法在 R 中循环复制值?
Is there a way to loop copying values in R?
我正在为我的硕士论文处理一个非常混乱的数据集,我需要一些帮助来将值从一列复制到其他列。
我需要做的是:
- 我需要将第 1 行的值复制到同一行的 price_close 列。
- 我需要将第 2 行的值复制到第 1 行的 price_high 列
- 我需要将第 3 行的值复制到第 1 行的 price_low 列
- 我需要将第 4 行的值复制到第 1 行的 price_open 列
- 我需要将第 5 行的值复制到第 1 行的 shares_outstanding 列
所有公司和所有日期都需要这样做。因此,我需要为下一家公司做同样的程序。含义:
- 我需要将第 5 行的值复制到同一行的 price_close 列。
- 我需要将 row+6 中的值复制到 row+5
中的 price_high 列
- 我需要将 row+7 中的值复制到 row+5
中的列 price_low
- 我需要将 row+8 中的值复制到 row+5
中的列 price_open
- 我需要将 row+9 中的值复制到 row+5
中的列 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
我正在为我的硕士论文处理一个非常混乱的数据集,我需要一些帮助来将值从一列复制到其他列。
我需要做的是:
- 我需要将第 1 行的值复制到同一行的 price_close 列。
- 我需要将第 2 行的值复制到第 1 行的 price_high 列
- 我需要将第 3 行的值复制到第 1 行的 price_low 列
- 我需要将第 4 行的值复制到第 1 行的 price_open 列
- 我需要将第 5 行的值复制到第 1 行的 shares_outstanding 列
所有公司和所有日期都需要这样做。因此,我需要为下一家公司做同样的程序。含义:
- 我需要将第 5 行的值复制到同一行的 price_close 列。
- 我需要将 row+6 中的值复制到 row+5 中的 price_high 列
- 我需要将 row+7 中的值复制到 row+5 中的列 price_low
- 我需要将 row+8 中的值复制到 row+5 中的列 price_open
- 我需要将 row+9 中的值复制到 row+5 中的列 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