我有大约50个具有相同列名的唯一数据帧。
现在我有这样的东西:
df1_cleaned <- df1$price
df1_cleaned <- df1$date
df2_cleaned <- df2$price
df2_cleaned <- df2$date
...
未清理的数据框中有10列,我只想获取每个列的第3列和第5列。
有没有一种方法而不必写出每个数据帧?
欢呼
答案 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个数据帧分别称为df1
,df2
,df3
,依此类推。您可以使用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')]
这种方法将在一个数据帧中为您提供所有数据。