我有資料并且我有包含變數名稱的向量 使用這個向量我想創建包含變數總和的新列 存在向量 這些向量是由 for 回圈生成的,所以我不知道向量的數量,也不知道變數的數量存在于每個向量中,即每次我生成包含不同變數名稱的 vec 時
例如:假設我的回圈將生成這三個向量:當 i=1 時為 Vec,當 i=2 時為 Vec,當 i=3 時為 Vec
Vec >
Vec >
Vec >
"A","B","C"
"B","D"
"D","E"
這是資料>資料
Name A B C D E
r1 1 5 12 21 15
r2 2 4 7 10 9
r3 5 15 6 9 6
r4 7 8 0 7 18
這是我應該獲得的第一個結果(從第一個向量開始)
Name A B C ABC D E
r1 1 5 12 18 21 15
r2 2 4 7 13 10 9
r3 5 15 6 26 9 6
r4 7 8 0 15 7 18
這是最終結果
Name A B C ABC D BD E DE
r1 1 5 12 18 21 26 15 36
r2 2 4 7 13 10 14 9 19
r3 5 15 6 26 9 24 6 15
r4 7 8 0 15 7 15 18 25
即 V1 包含變數 "A" 、 "B" 、 "C" 的名稱,ABC 包含變數 A、B 和 C 的總和,對于 BD(B 和 D 的總和)和 DE(D 和 E 的總和) )
另請注意,我希望我的新列的名稱是向量中存在的列的名稱
如果您需要更多資訊和更多解釋或細節,請告訴我
uj5u.com熱心網友回復:
一個解決方案purrr::reduce:
library(tidyverse)
df <- data.frame(
stringsAsFactors = FALSE,
Name = c("r1", "r2", "r3", "r4"),
A = c(1L, 2L, 5L, 7L),
B = c(5L, 4L, 15L, 8L),
C = c(12L, 7L, 6L, 0L),
D = c(21L, 10L, 9L, 7L),
E = c(15L, 9L, 6L, 18L)
)
vts <- list(c("A","B","C"),c("B","D"),c("D","E"))
reduce(vts, function(x,y)
bind_cols(x, !!paste0(y,collapse = "") := rowSums(x[,y])), .init=df)
#> Name A B C D E ABC BD DE
#> 1 r1 1 5 12 21 15 18 26 36
#> 2 r2 2 4 7 10 9 13 14 19
#> 3 r3 5 15 6 9 6 26 24 15
#> 4 r4 7 8 0 7 18 15 15 25
uj5u.com熱心網友回復:
對于這些型別的任務,使用回圈來增量更新 data.frame 的效率(非常)可能很低。建議使用類似于@PaulSmith 提供的串列方法。
但是,要回答這個問題,如果您Vec是對 進行某種操作的結果ABC,請使用tidyverse進行爭吵和glue變數名稱語法:
library(tidyverse)
update_vec <- function(df, vec){
vec_name <- paste0(vec, collapse = "")
x <- parse_expr(paste0(syms(vec), collapse = " "))
df %>%
mutate("{vec_name}" := !!x)
}
現在我們可以在有一個像這樣的新向量時呼叫它
df <-
tibble::tribble(
~Name, ~A, ~B, ~C, ~D, ~E,
"r1", 1, 5, 12, 21, 15,
"r2", 2, 4, 7, 10, 9,
"r3", 5, 15, 6, 9, 6,
"r4", 7, 8, 0, 7, 18
)
df %>%
update_vec(Vec1)
# A tibble: 4 x 7
Name A B C D E ABC
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 r1 1 5 12 21 15 18
2 r2 2 4 7 10 9 13
3 r3 5 15 6 9 6 26
4 r4 7 8 0 7 18 15
最后,進一步閱讀何時以及如何減少代碼中的重復/復制粘貼。
uj5u.com熱心網友回復:
library(purrr)
library(stringr)
v <- list(c("A","B","C"),c("B","D"),c("D","E"))
express <- setNames(v, map(v, str_flatten)) %>%
imap(~ parse_expr(sprintf("rowSums(across(c(%s)))", paste(.x, collapse = ","))))
df %>%
mutate(!!! express)
輸出
Name A B C D E ABC BD DE
1 r1 1 5 12 21 15 18 26 36
2 r2 2 4 7 10 9 13 14 19
3 r3 5 15 6 9 6 26 24 15
4 r4 7 8 0 7 18 15 15 25
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/344021.html
