R-将函数应用于多个数据帧,数据帧名称将从另一个数据帧中提取

时间:2017-01-25 08:15:13

标签: r

我已经看过关于这个主题的帖子,但遗憾的是无法找到我想要实现的目标。我有三个数据帧(data1,data2,data3)如下:

first_name=c("xxx", "yyy", "zzz")
address=c("ca", "sa", "la")
data1=data.frame(first_name,address)

first_name=c("aaa", "bbb", "ccc")
address=c("ca", "sa", "la")
data2=data.frame(first_name,address)

first_name=c("abc", "bab", "cac")
address=c("ca", "sa", "la")
data3=data.frame(first_name,address)

我需要将一个函数应用于3个以上的数据帧(不仅这3个还可以有更多,它必须是动态的)。数据框存在于我的环境中。此外,还有一个元数据数据框,其中包含此数据框的名称以及其他列。

name = c(2, 3, 5) 
entity = c("aa", "bb", "cc") 
tablename = c("data1", "data2", "data3") 
metadata = data.frame(name, entity, tablename)

从上面的元数据中,我需要提取tablename列的值,这些值基本上是我环境中已存在的数据帧。我需要对这些数据帧应用一个函数,并为每个数据帧生成不同的输出。 这是我的功能(例子):

myfunction <- function(data) {
if(class(data)[1] != 'data.frame' && class(data)[1] != 'data.table') {
stop('Invalid input: data should be either data.frame or data.table')
} else {
variable <- names(data)
class <- sapply(data, class)
contents <- data.frame(variable, 
                       class)
return(contents)  
}
} 

但是当我想要使用&#34; list&#34;和&#34; lapply&#34;它不起作用。

tablelist <- list(sqldf("select tablename from metadata group by 1"))
lapply(tablelist,myfunction)

上面的代码将我的函数应用于tablename列本身而不是tablename列的值。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这样做:

data1 <- data.frame(first_name=c("xxx", "yyy", "zzz"), address=c("ca", "sa", "la"))
data2 <- data.frame(first_name=c("aaa", "bbb", "ccc"), address=c("ca", "sa", "la"))
data3 <- data.frame(first_name=c("abc", "bab", "cac"), address=c("ca", "sa", "la"))

metadata <- data.frame(name = c(2, 3, 5), entity = c("aa", "bb", "cc"), tablename = c("data1", "data2", "data3") )

myfunction <- function(data) {
  if(class(data)[1] != 'data.frame' && class(data)[1] != 'data.table') {
    stop('Invalid input: data should be either data.frame or data.table')
  } else {
    variable <- names(data)
    class <- sapply(data, class)
    contents <- data.frame(variable, 
                           class)
    return(contents)  
  }
} 

lapply(as.character(metadata$tablename), function(dfname) myfunction(get(dfname)))

as.character()是必需的,因为data.frame()默认为StringsAsFactors=TRUE

或者您更改为StringsAsFactors=FALSE

metadata <- data.frame(name = c(2, 3, 5), entity = c("aa", "bb", "cc"), 
                       tablename = c("data1", "data2", "data3") , stringsAsFactors = FALSE)
lapply(metadata$tablename, function(dfname) myfunction(get(dfname)))

您可以将结果放在列表中:L <- lapply(...)您可以通过(例如)L[[1]]查看列表中的一个元素。您可以命名列表元素以按名称访问元素:

names(L) <- as.character(metadata$tablename)
L[["data1"]]   # or
L$data1