如何将相同的功能应用于R中的多个数据帧

时间:2020-03-30 21:50:46

标签: r for-loop

我正在将相同的功能应用于多个数据框。例如,我要在df1中合并column2和column3。应用此功能后,df1将获得一个名为col2_col3的新列。

 df1 <- data.frame(x = rep(3, 5), y = seq(1, 5, 1), ID = letters[1:5])
 df2 <- data.frame(x = rep(5, 5), y = seq(2, 6, 1), ID = letters[6:10])
#I define a function:
PasteTwoColumn <- function(x) 
{
  x$col2_col3 <- paste(x[,2], x[,3], sep = "_")
  return(x)
}
#apply the function to the df1, it works.
df1 <- PasteTwoColumn(df1)
# but I failed by an lappy function, because it returns a list, not the dataframe
mylist <- list(df1, df2) 
result <- lapply(mylist, PasteTwoColumn)

我想继续将此功能应用于所有数据框,例如df1,df2,df3 ... df100。输出文件应保持相同类型的数据框和名称。

lapply 函数不起作用,因为它返回一个列表,而不是单独的数据框。

1 个答案:

答案 0 :(得分:2)

我们可以将数据集保留在list中,并用list遍历lapply

lst1 <- lapply(list(df1, df2), PasteTwoColumn)

如果有许多数据集,请使用mget将数据集的值放入list

lst1 <- lapply(mget(paste0('df', 1:100)), PasteTwoColumn)

或者代替paste,我们也可以使用ls

lst1 <- lapply(mget(ls(pattern = '^df\\d+$')), PasteTwoColumn)

如果我们需要更新原始对象,请使用list2env

list2env(lst1, .GlobalEnv) #not recommended though

如果我们需要使用for循环

for(obj in paste0("df", 1:100)) {
      assign(obj,  PasteTwoColumn(get(obj)))
  }