我已经看过关于这个主题的帖子,但遗憾的是无法找到我想要实现的目标。我有三个数据帧(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列的值。
非常感谢任何帮助。
答案 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