![](/img/trans.png)
[英]Mutating chosen columns in the data.frame or tibble with dplyr package R
[英]Mutating multiple columns in a data frame using dplyr
我有以下數據框df
:
v1 v2 v3 v4
1 1 5 7 4
2 2 6 10 3
我想獲得以下數據幀df2
乘以列v1 * v3和v2 * v4:
v1 v2 v3 v4 v1v3 v2v4
1 1 5 7 4 7 20
2 2 6 10 3 20 18
我怎么能用dplyr
做到這dplyr
? 使用mutate_each
?
我需要一個可以推廣到大量變量而不僅僅是4(v1到v4)的解決方案。 這是生成示例的代碼:
v1 <- c(1, 2)
v2 <- c(5,6)
v3 <- c(7, 10)
v4 <- c(4, 3)
df <- data.frame(v1, v2, v3, v4)
v1v3 <- c(v1 * v3)
v2v4 <- c(v2 * v4)
df2 <- cbind(df, v1v3, v2v4)
你真的很親密。
df2 <-
df %>%
mutate(v1v3 = v1 * v3,
v2v4 = v2 * v4)
這么簡單的語言吧?
有關更多精彩技巧,請參閱此處。
編輯:感謝@Facottons指向這個答案: https ://stackoverflow.com/a/34377242/5088194,這是一個解決這個問題的整潔方法。 它使得人們不必在每個新列所需的硬編碼中寫入一行。 雖然它比Base R方法更冗長,但邏輯至少更直接透明/可讀。 值得注意的是,必須存在至少一半的行,因為這種方法的列有效。
# prep the product column names (also acting as row numbers)
df <-
df %>%
mutate(prod_grp = paste0("v", row_number(), "v", row_number() + 2))
# converting data to tidy format and pairing columns to be multiplied together.
tidy_df <-
df %>%
gather(column, value, -prod_grp) %>%
mutate(column = as.numeric(sub("v", "", column)),
pair = column - 2) %>%
mutate(pair = if_else(pair < 1, pair + 2, pair))
# summarize the products for each column
prod_df <-
tidy_df %>%
group_by(prod_grp, pair) %>%
summarize(val = prod(value)) %>%
spread(prod_grp, val) %>%
mutate(pair = paste0("v", pair, "v", pair + 2)) %>%
rename(prod_grp = pair)
# put the original frame and summary frames together
final_df <-
df %>%
left_join(prod_df) %>%
select(-prod_grp)
我想我找到了一個解決方案:
df %>%
mutate(n = df[1:(ncol(df)/2)] * df[(1+ncol(df)/2):(ncol(df))]) %>% head()
結果對任意數量的變量都有效。 它只是新變量名稱的問題。 這是結果:
v1 v2 v3 v4 n.v1 n.v2
1 1 5 7 4 7 20
2 2 6 10 3 20 18
只需使用mutate,用逗號分隔新列mutate(df,"v1v3"=v1*v3,"v2v4"= v2*v4)
我們可以使用base R
而不是使用任何額外的包,如dplyr
或data.table
我們可以使用mapply
同時向量化多個向量的操作
n <- ncol(df)/2
mapply(`*`, df[1:n], df[(n + 1):ncol(df)])
# v1 v2
#[1,] 7 20
#[2,] 20 18
我們可以將此數據幀合並( cbind
)到原始數據幀。
如果你有興趣在tidyverse
解決方案在等效purrr
將是變種map2
purrr::map2_df(df[1:n], df[(n + 1):ncol(df)], `*`)
# A tibble: 2 x 2
# v1 v2
# <dbl> <dbl>
#1 7 20
#2 20 18
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.