【问题标题】:Using apply functions to perform different operations for each column in a data frame使用应用函数对数据框中的每一列执行不同的操作
【发布时间】:2022-12-13 09:37:44
【问题描述】:

我有以下两个数据框。

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 中的列标题与 df_2 中的 H1 匹配,我想将该列乘以 2。如果 df 中的列标题与 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 循环一次对所有列进行这些计算?我也愿意接受其他更优雅的解决方案。

【问题讨论】:

    标签: r


    【解决方案1】:
    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)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-12
      • 2020-05-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      相关资源
      最近更新 更多