for循环消除多个dfs中的列

时间:2017-06-06 00:12:59

标签: r for-loop dplyr

我有大约10个数据帧。例如,这里有两个:

name <- c("A", "B", "C")
name.footnote <- c("this", "that", "the other")
class <- c("one", "two", "three")
class.footnote <- c("blank", "blank", "blank")

df1 <- data.frame(name, name.footnote, class, class.footnote)
df2 <- data.frame(name, name.footnote, class, class.footnote)

当我逐个删除列中的列时,我的代码运行正常。

library(dplyr)
df1 <- select(df1, -ends_with("footnote"))

我想编写一个循环来处理两个代码较少的dfs,但是无法使循环正常工作。我一直收到同样的错误消息:

Error in UseMethod("select_") :   no applicable method for 'select_'
 applied to an object of class "character".

请参阅下面我尝试的一些循环代码。我错过了什么?

listofDfs <- list("df1","df2")

1

lapply(listofDfs, function(df){
  df <- select(df, -ends_with("footnote"))
  return(df)
  }
)

2。

for (i in listofDfs){
  i <- select(i, -ends_with("footnote"))
}

1 个答案:

答案 0 :(得分:2)

在定义列表listofDfs <- list(df1,df2)时尝试删除引号。如错误所述,当您使用引号时,列表中的元素是字符,而不是data.frame所期望的select()

library(dplyr)

listofDfs <- list(df1,df2)

#using lapply
list_out1 <- lapply(listofDfs, function(df){
  df <- select(df, -ends_with("footnote"))
  return(df)
})

#using for loop
list_out2 <- vector("list", length(listofDfs))
for (i in seq_along(listofDfs)){
  list_out2[[i]] <- select(listofDfs[[i]], -ends_with("footnote"))
}

跟进每条评论

您可以使用getassign来处理原始字符列表,并在迭代时操纵全局环境中的dfs。

listofDfs <- list('df1','df2')

invisible(lapply(listofDfs, function(i){
  df <- select(get(i, globalenv()), -ends_with("footnote"))
  assign(i, df, envir = globalenv())
}))

for (i in listofDfs){
  df <- select(get(i, globalenv()), -ends_with("footnote"))
  assign(i, df, envir = globalenv())
}