[英]loop to multiply across columns
我有列標記的數據幀sales1
, sales2
, price1
, price2
我要乘以計算收入sales1
* price1
迭代的方式在每個號碼等上。
data <- data_frame(
"sales1" = c(1, 2, 3),
"sales2" = c(2, 3, 4),
"price1" = c(3, 2, 2),
"price2" = c(3, 3, 5))
data
# A tibble: 3 x 4
# sales1 sales2 price1 price2
# <dbl> <dbl> <dbl> <dbl>
#1 1 2 3 3
#2 2 3 2 3
#3 3 4 2 5
為什么以下代碼不起作用?
data %>%
mutate (
for (i in seq_along(1:2)) {
paste0("revenue",i) = paste0("sales",i) * paste0("price",i)
}
)
假設你的列已經訂購( sales1
, sales2
, price1
, price2
)。 我們可以將數據框分為兩部分,然后相乘
data[grep("sales", names(data))] * data[grep("price", names(data))]
# sales1 sales2
#1 3 6
#2 4 9
#3 6 20
如果尚未根據名稱對列進行排序,則可以使用order
對其進行order
,然后使用上述命令。
data <- data[order(names(data))]
這個答案不是很簡短。 為此,@ RonakShah的現有答案值得一看!
我的答復旨在解決有關在tidyverse
中嘗試執行此操作的困難的廣泛關注。 我的理解是這很困難,因為數據當前不是“整潔”的格式。 相反,您可以創建一個整潔的數據框,如下所示:
library(tidyverse)
tidy_df <- data %>%
rownames_to_column() %>%
gather(key, value, -rowname) %>%
extract(key, c("variable", "id"), "([a-z]+)([0-9]+)") %>%
spread(variable, value)
然后使最終計算變得簡單明了
tidy_df %>% mutate(revenue = sales * price)
#> # A tibble: 6 x 5
#> rowname id price sales revenue
#> <chr> <chr> <dbl> <dbl> <dbl>
#> 1 1 1 3 1 3
#> 2 1 2 3 2 6
#> 3 2 1 2 2 4
#> 4 2 2 3 3 9
#> 5 3 1 2 3 6
#> 6 3 2 5 4 20
如果您需要將數據恢復為原始格式,盡管對我來說這很笨拙(我相信可以通過某種方式進行改進),但是可以。
tidy_df %>% mutate(revenue = sales * price) %>%
gather(key, value, -c(rowname, id)) %>%
unite(key, key, id, sep = "") %>%
spread(key, value) %>%
select(starts_with("price"),
starts_with("sales"),
starts_with("revenue"))
#> # A tibble: 3 x 6
#> price1 price2 sales1 sales2 revenue1 revenue2
#> * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 3 3 1 2 3 6
#> 2 2 3 2 3 4 9
#> 3 2 5 3 4 6 20
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.