循环多个数据帧以在 R 中执行多个操作
Loop over several dataframes to do several actions in R
我有几个数据帧(dataframe_1
、dataframe_2
...)我想循环以便在所有数据帧上执行相同的功能。这些函数是:
- Select 具体栏目:
dataframe_1 <- dataframe_1[, c("Column_1", "Column_2")]
- 重命名列:
dataframe_1 <- rename(dtaframe_1, New_Name_for_Column_1 = Column_1)
- 创建新列。例如,通过使用
ifelse()
函数:
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)
}
我有几个数据帧(dataframe_1
、dataframe_2
...)我想循环以便在所有数据帧上执行相同的功能。这些函数是:
- Select 具体栏目:
dataframe_1 <- dataframe_1[, c("Column_1", "Column_2")]
- 重命名列:
dataframe_1 <- rename(dtaframe_1, New_Name_for_Column_1 = Column_1)
- 创建新列。例如,通过使用
ifelse()
函数:
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)
}