2015-11-06 61 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