循环多个数据帧以在 R 中执行多个操作

Loop over several dataframes to do several actions in R

我有几个数据帧(dataframe_1dataframe_2...)我想循环以便在所有数据帧上执行相同的功能。这些函数是:

dataframe_1 <- dataframe_1[, c("Column_1", "Column_2")]

dataframe_1 <- rename(dtaframe_1, New_Name_for_Column_1 = Column_1)
dataframe_1$Column_3 <- ifelse(dataframe_1$Column_1 = 5, 1, 0)

我已经用一些数据帧单独证明了代码没有错误。

但是,如果我执行以下循环:

list_dataframes = list(dataframe_1, dataframe_2)

for (dataframe in 1:length(list_dataframes)){
 dataframe <- dataframe[, c("Column_1", "Column_2")]
 dataframe <- rename(dtaframe, New_Name_for_Column_1 = Column_1)
 dataframe$Column_3 <- ifelse(dataframe$Column_1 = 5, 1, 0)
}

出现以下错误:

Error in dataframe[, c("Column_1", "Column_2",  : 
  incorrect number of dimensions

(所有数据框都具有相同的列名。)

有什么想法吗?

谢谢!

代码 for (dataframe in 1:length(list_dataframes)) 创建了一个数字向量 c(1,2),其中一次一个值的值存储在名为 dataframe 的变量中。这个迭代变量是标量,即它有 1 个维度和 1 的长度。这就是为什么你不能子集做 dataframe[, c("Column_1", "Column_2")] 而是这样做:list_dataframes[[dataframe]][, c("Column_1", "Column_2")]

您可以尝试使用 purrr::map_dfr() 遍历数据帧,例如

list_dataframes = list(dataframe_1, dataframe_2)

library(dplyr)
library(purrr)

list_dataframes %>% 
  map_dfr(~.x %>% 
            select(Column_1, Column_2) %>% 
            rename(New_Name_for_Column_1 = Column_1) %>% 
            mutate(Column3= ifelse(Column_1 == 5, 1, 0)))

您不是在迭代数据帧列表,而是在序列 1:length(list_dataframes) 上迭代。请考虑以下示例:

a = list("a", "b")
for (i in a){print(i)}
for (i in 1:length(a)){print(i)}

在您的代码中,您需要像这样显式访问列表元素:

list_dataframes = list(dataframe_1, dataframe_2)

for (df_number in 1:length(list_dataframes)){
  list_dataframes[[df_number]] <- list_dataframes[[df_number]][, c("Column_1", "Column_2")]
  list_dataframes[[df_number]] <- rename(list_dataframes[[df_number]], New_Name_for_Column_1 = Column_1)
  list_dataframes[[df_number]]$Column_3 <- ifelse(list_dataframes[[df_number]]$Column_1 = 5, 1, 0)
}