2015-11-06 58 views
0

我有一套R表,我想审计它们。 我想创建一个表,其中包含内存中data.frame的每一列,data.frame和列的类型。表的列表的说明

是否有现有的功能呢? 如果我自己写,最好的方法是什么?

由于str()不返回任何值,我想约summary + lapply

但我无法自动找到data.frame列表。 ls()返回对象的向量,但我不知道如何将is.data.frame应用于字符串。

我的会议:

df1 <- data.frame(t = 1, t2 = "c") 
df2 <- data.frame(t1 = TRUE, t4 = "j", stringsAsFactors = F) 
df3 <- data.frame(dt = Sys.Date(), dt2 = Sys.time()) 
u <- "string" 

结果我想:

audit <- data.frame(table = c(rep(df1, 2), rep(df2, 2), rep(df3, 2) 
     , column = c("t", "t2", "t1", "t4", "dt", "dt2") 
     , type = c("num", "Factor", "logi", "chr", "Date", "POSIXct")) 
     , stringsAsFactors = F) 
+0

请提供一个完整的最小可验证的例子。 – 2015-11-06 10:04:38

+0

试试'lapply(data_lst,summary)'或'lapply(mget(data_lst),summary)'。如果列表是一个R'?list'对象,则第一个将工作,第二个将在'vector'中的一系列数据框名称。 –

+0

@PierreLafortune抱歉,我找不到函数data_lst。 – YCR

回答

3

1)这是足够接近你想要什么?

# returns a character vector of names of all data.frames in envir 
data.frame.names <- function(envir = .GlobalEnv) { 
    Filter(function(nam) is.data.frame(get(nam, envir)), ls(envir)) 
} 

# returns character matrix with names, columns and types of data.frame 
# with name nam in environment envir 
data.frame.info <- function(nam, envir = .GlobalEnv) { 
    DF <- get(nam, envir) 
    cbind(data.frame = nam, 
      columns = names(DF), 
      class = sapply(DF, function(col) class(col)[1])) 
} 

do.call(rbind, lapply(data.frame.names(), data.frame.info)) 

,并提供:

data.frame columns class  
t "df1"  "t"  "numeric" 
t2 "df1"  "t2" "factor" 
t1 "df2"  "t1" "logical" 
t4 "df2"  "t4" "character" 
dt "df3"  "dt" "Date"  
dt2 "df3"  "dt2" "POSIXct" 

2)如果你只是想显示R控制台上的信息那么这可能是足够的。它利用data.frame.names以上:

ls.str(pattern = paste(paste0("^", data.frame.names(), "$"), collapse = "|")) 

,并提供:

df1 : 'data.frame':  1 obs. of 2 variables: 
$ t : num 1 
$ t2: Factor w/ 1 level "c": 1 
df2 : 'data.frame':  1 obs. of 2 variables: 
$ t1: logi TRUE 
$ t4: chr "j" 
df3 : 'data.frame':  1 obs. of 2 variables: 
$ dt : Date, format: "2015-11-06" 
$ dt2: POSIXct, format: "2015-11-06 05:14:40" 
+0

谢谢,1)正是我一直在寻找的。 get()函数是一个很棒的发现。 – YCR