我再次堅持這個希望簡單的任務。
我有以下資料框:
df <- data.frame(x1 = 1:3,
x2 = 2:4,
x3 = 3:5,
y1 = 1:3,
y2 = 2:4,
y3 = 3:5)
我現在只是想通過每個下標“回圈”并將 x* 與 y* 列相乘,即 x1 * y1、x2 * y2 等等,然后將這些結果添加到我的資料中。
對于這些型別的任務,我一直認為這應該很容易通過一種map方法來實作,但我沒有讓它發揮作用,例如
library(tidyverse)
df |>
map2(.x = _,
.y = 1:3,
.f = ~.x |>
mutate(!!sym(paste0(results, .y)) := !!sym(paste0(x, .y)) * !!sym(paste0(y, .y))))
不起作用。
我還考慮過使用帶有 的東西across,但這也行不通,因為我無法告訴對方在 x 和 y 輸入上“矢量化”。
有任何想法嗎?
uj5u.com熱心網友回復:
使用reduce而不是map2你可以這樣做:
library(dplyr)
library(purrr)
df |>
reduce(1:3,
.f = ~ .x |>
mutate(!!sym(paste0("results", .y)) := !!sym(paste0("x", .y)) * !!sym(paste0("y", .y))),
.init = _
)
#> x1 x2 x3 y1 y2 y3 results1 results2 results3
#> 1 1 2 3 1 2 3 1 4 9
#> 2 2 3 4 2 3 4 4 9 16
#> 3 3 4 5 3 4 5 9 16 25
uj5u.com熱心網友回復:
訣竅是使用across兩次:
library(dplyr)
df |>
mutate(across(starts_with("x"), .names = "xy{gsub('x', '', col)}") * across(starts_with("y")))
# x1 x2 x3 y1 y2 y3 xy1 xy2 xy3
#1 1 2 3 1 2 3 1 4 9
#2 2 3 4 2 3 4 4 9 16
#3 3 4 5 3 4 5 9 16 25
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/527701.html
