繁体   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