簡體   English   中英

使用應用函數對數據框中的每一列執行不同的操作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM