[英]Using apply functions to perform different operations for each column in a data frame
我有以下兩個數據框。
a <- c(3,2,6,7,5)
b <- c(2,5,7,8,1)
d <- c(3,6,2,1,6)
df <- data.frame(a, b, d)
a1 <- c("a", "H1")
b1 <- c("b", "H2")
d1 <- c("d", "H1")
df_2 <- data.frame(a1, b1, d1)
方便的是,df 中的列名以列為基礎匹配 df_2 的第 1 行。 我想使用 df_2 數據框來更改 df 中的列。 對於這個例子,我只想將每一列乘以一個不同的因子。 如果 df 中的列 header 與 df_2 中的 H1 匹配,我想將該列乘以 2。如果 df 中的列 header 與 df_2 中的 H2 匹配,我想將該列乘以 3。我可以一次做這一列使用以下代碼。
#How to change column 1
df[,1] <- if (df_2[2,1] == "H1") {
df[,1]*2
} else if (df_2[2,1] == "H2") {
df[,1]*3
}
#How to change column 2
df[,2] <- if (df_2[2,2] == "H1") {
df[,2]*2
} else if (df_2[2,2] == "H2") {
df[,2]*3
}
#How to change column 3
df[,3] <- if (df_2[2,3] == "H1") {
df[,3]*2
} else if (df_2[2,3] == "H2") {
df[,3]*3
}
我如何使用應用函數(首選)或 for 循環一次對所有列進行這些計算? 我也願意接受其他更優雅的解決方案。
一種方法 - 使用janitor::row_to_names
將 'df_2' 的第一行轉換為列名(以便我們可以 select across
第一個數據集的列名的列),遍歷 'df_2_new' 的列,乘以 2 或3 基於從df_2_new中提取的列的值
library(dplyr)
library(janitor)
df_2_new <- row_to_names(df_2, 1)
df %>%
mutate(across(all_of(names(df_2_new)),
~ case_when(df_2_new[[cur_column()]] == "H1"~ .x *2,
df_2_new[[cur_column()]] == "H2" ~ .x * 3, TRUE ~ .x)))
-輸出
a b d
1 6 6 6
2 4 15 12
3 12 21 4
4 14 24 2
5 10 3 12
在基地 R 你可以使用:
fun <-function(x, y)switch(x, H1 = y*2, H2 = y*3)
mapply(fun, setNames(df_2[2,],df_2[1,])[names(df)],df)
a b d
[1,] 6 6 6
[2,] 4 15 12
[3,] 12 21 4
[4,] 14 24 2
[5,] 10 3 12
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.