不幸的是,我面臨的問題是我的 for 回圈或掃描命令不起作用。我有一個從大型 Excel 電子表格 (10000 x 26) 讀取的資料集 (df1) 和另一個 Excel 電子表格 (1 x 26) 的另一個資料集 (df2)。我想用df2減去/添加df1的每一行。不幸的是,我的代碼不起作用。為了更好地展示它,我在下面添加了一張我正在計劃的圖片。 在此處輸入影像描述
uj5u.com熱心網友回復:
向量按列添加/減去,因此如果要按行執行,首先必須轉置df1,然后執行加法/減法,然后轉回:
t(t(df1) unlist(df2))
uj5u.com熱心網友回復:
我將假設這兩個資料框具有相同的列標題,因為它們具有相同的列數。如果這個假設是錯誤的,你可以糾正我。我會繪制出列名,然后從 df2 中的所有值中減去 df2 中列的值。
library(tidyverse)
#example data
df1 <- mtcars
df2 <- mtcars[1,] |>
mutate(across(everything(), ~ . runif(n = 1, min = -10, max = 10)))
#solution
colnames(df1) |>
map_dfc(\(x){
val <- pull(df2, !!sym(x))
df1 |>
select(!!sym(x)) |>
mutate(!!quo(!!sym(x)) := !!sym(x) - val) |>
as_tibble()
})
#> # A tibble: 32 x 11
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 -5.87 7.11 -8.99 -2.41 8.10 4.92 0.908 -2.14 2.85 -1.07 8.76
#> 2 -5.87 7.11 -8.99 -2.41 8.10 5.17 1.47 -2.14 2.85 -1.07 8.76
#> 3 -4.07 5.11 -61.0 -19.4 8.05 4.62 3.06 -1.14 2.85 -1.07 5.76
#> 4 -5.47 7.11 89.0 -2.41 7.28 5.51 3.89 -1.14 1.85 -2.07 5.76
#> 5 -8.17 9.11 191. 62.6 7.35 5.74 1.47 -2.14 1.85 -2.07 6.76
#> 6 -8.77 7.11 56.0 -7.41 6.96 5.76 4.67 -1.14 1.85 -2.07 5.76
#> 7 -12.6 9.11 191. 133. 7.41 5.87 0.288 -2.14 1.85 -2.07 8.76
#> 8 -2.47 5.11 -22.3 -50.4 7.89 5.49 4.45 -1.14 1.85 -1.07 6.76
#> 9 -4.07 5.11 -28.2 -17.4 8.12 5.45 7.35 -1.14 1.85 -1.07 6.76
#> 10 -7.67 7.11 -1.39 10.6 8.12 5.74 2.75 -1.14 1.85 -1.07 8.76
#> # ... with 22 more rows
uj5u.com熱心網友回復:
使用 purrr::map2_df
Purrr 的map 函式是一個非常有用的函式族,它遍歷向量并將相同的函式應用于每個元素。簡要地:
map(x, f)對f(x[[n]])的每個元素執行x,回傳串列中的輸出map_df(x, f)對f(x[[n]])的每個元素執行操作x,將輸出作為資料框回傳。map2_df(x, y, f)并行處理f(x[[n]], y[[n]])每個元素x,y將輸出作為資料幀回傳。
由于資料框是列串列,我們可以map2_df(df1, df2, ` `)對 df1 和 df2 的每一列依次運行“加法函式”,然后在一行代碼中將結果串列轉換為資料框。
## setting up the example -----------------------------------------
set.seed("123") # (so that the random numbers are always the same)
## tiny helper to make a neater example:
random_numbers <- function(...) runif(..., max = 10) |> round()
df1 <- data.frame(
a = random_numbers(3),
b = random_numbers(3),
c = random_numbers(3)
)
df1
#> a b c
#> 1 3 9 5
#> 2 8 9 9
#> 3 4 0 6
df2 <- data.frame(a = 1, b = 2, c = 3)
## The actual code you'll need ------------------------------------
require(purrr)
#> Loading required package: purrr
map2_df(df1, df2, ` `)
#> # A tibble: 3 × 3
#> a b c
#> <dbl> <dbl> <dbl>
#> 1 4 11 8
#> 2 9 11 12
#> 3 5 2 9
由reprex 包于 2022-10-07 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/512373.html
上一篇:將值陣列傳遞給字串文本
