如何将相同的过滤器应用于50多个数据帧?

时间:2019-12-06 00:07:06

标签: r dataframe dplyr

我有大约50个具有相同列名的唯一数据帧。

现在我有这样的东西:

df1_cleaned <- df1$price
df1_cleaned <- df1$date 
df2_cleaned <- df2$price
df2_cleaned <- df2$date
...

未清理的数据框中有10列,我只想获取每个列的第3列和第5列。

有没有一种方法而不必写出每个数据帧?

欢呼

2 个答案:

答案 0 :(得分:2)

您可以通过执行df_cleaned <- df[,c("price","date")]一次从数据框中提取多个列。但是,要处理50个不同的数据帧(所有数据帧都具有相同的列名),可以使用for循环。这是一种实现方法:

1)定义要处理的数据帧列表

list_of_df = list.files(pattern = ... , path = ...) # ... stands for argument you have to pass and dependent of your files. check the ?list.files

2)遍历数据帧列表,清理它们并将其分配给您的环境:

for(i in list_of_df)
{
  df = read.table(i,...) # ... stands for arguments to be passed in this function and dependent of your type of file. Check ?read.table 
  df <- df[,c("price","date")]
  assign(paste0(i,"_cleaned"), df,.GlobalEnv)
}

优点:您将清理50个数据框并准备在您的环境中使用。 不便之处:您的环境中有50个数据框,可能会很杂乱

替代:@thelatemail提出的建议是将这50个清除的数据帧存储到列表中。这样,您的环境中将只有一个填充了数据框的对象。为此,过程大致相同:

1)定义要处理的数据帧列表

list_of_df = list.files(pattern = ... , path = ...) # ... stands for argument you have to pass and dependent of your files. check the ?list.files

2)创建一个列表对象以存储数据框

final_list = vector("list", length(list_of_df)
names(final_list) = list_of_df

3)遍历数据框列表,清理它们并将其添加到列表对象:

for(i in 1:length(list_of_df))
{
  df = read.table(list_of_df[i],...) # ... stands for arguments to be passed in this function and dependent of your type of file. Check ?read.table
  df <- df[,c("price","date")]
  final_list[[i]] <- df
}

答案 1 :(得分:1)

将@thelatemail的评论变成答案。假设您的50个数据帧分别称为df1df2df3,依此类推。您可以使用mget将它们添加到列表中,然后通过位置选择列

temp <- lapply(mget(paste0("df", 1:50)), `[`, c(1,3))

或通过名称

temp <- lapply(mget(paste0("df", 1:50)), `[`, c('price', 'date'))

这种方法将返回一个数据帧列表,如果您需要单独的单个数据帧,请执行

list2env(temp, .GlobalEnv)

或者将所有数据帧组合在一起,并且仅将其子集一次。

按位置

temp <- do.call(rbind, mget(paste0("df", 1:50)))[c(1, 3)]

或按名称

temp <- do.call(rbind, mget(paste0("df", 1:50)))[c('price', 'date')]

这种方法将在一个数据帧中为您提供所有数据。