发送STR()输出到视图()

时间:2019-02-02 20:22:36

标签: r dataframe view metadata

我正在研究具有313个变量的数据集中的变量。 我当前正在打印的full list of variables到输出屏幕使用:

str(df, list.len=ncol(df))

str()输出是非常有用的,但难以在输出读取时,有这么多的变量窗口。

是否有命令,类似于str(),但是,可以使输出发送到浏览窗口(View())?

这将非常有用:

library(dplyr)    
d %>% str() %>% View()

Outputing一个数据集:varnames,VARTYPE,values_string

这存在吗?

4 个答案:

答案 0 :(得分:1)

根据您的描述,它看起来像这里的实现:https://www.r-bloggers.com/str-implementation-for-data-frames/可以工作。它将str()的结果输出到data.frame,然后可以在View()中使用它。

#' Creates a \code{data.frame} version of the str function for data.frames.
#' 
#' Note that this function only works with \code{data.frames}. The function
#' will throw an error for any other object types.
#' 
#' @param n the first n element to show
#' @param width maximum width in characters for the examples to show
#' @param n.levels the first n levels of a factor to show.
#' @param width.levels maximum width in characters for the number of levels to show.
#' @param factor.values function defining how factor examples should be printed.
#'        Possible values are \code{as.character} or \code{as.integer}.
#' @export
#' @examples
#' data(iris)
#' str(iris)
#' strtable(iris)
#' strtable(iris, factor.values=as.integer)
strtable <- function(df, n=4, width=60, 
                     n.levels=n, width.levels=width, 
                     factor.values=as.character) {
    stopifnot(is.data.frame(df))
    tab <- data.frame(variable=names(df),
                      class=rep(as.character(NA), ncol(df)),
                      levels=rep(as.character(NA), ncol(df)),
                      examples=rep(as.character(NA), ncol(df)),
                      stringsAsFactors=FALSE)
    collapse.values <- function(col, n, width) {
        result <- NA
        for(j in 1:min(n, length(col))) {
            el <- ifelse(is.numeric(col),
                         paste0(col[1:j], collapse=', '),
                         paste0('"', col[1:j], '"', collapse=', '))
            if(nchar(el) <= width) {
                result <- el
            } else {
                break
            }
        }
        if(length(col) > n) {
            return(paste0(result, ', ...'))
        } else {
            return(result)
        }
    }

    for(i in seq_along(df)) {
        if(is.factor(df[,i])) {
            tab[i,]$class <- paste0('Factor w/ ', nlevels(df[,i]), ' levels')
            tab[i,]$levels <- collapse.values(levels(df[,i]), n=n.levels, width=width.levels)
            tab[i,]$examples <- collapse.values(factor.values(df[,i]), n=n, width=width)
        } else {
            tab[i,]$class <- class(df[,i])[1]
            tab[i,]$examples <- collapse.values(df[,i], n=n, width=width)
        }

    }

    class(tab) <- c('strtable', 'data.frame')
    return(tab)
}

#' Prints the results of \code{\link{strtable}}.
#' @param x result of code \code{\link{strtable}}.
#' @param ... other parameters passed to \code{\link{print.data.frame}}.
#' @export
print.strtable <- function(x, ...) {
    NextMethod(x, row.names=FALSE, ...)
}

答案 1 :(得分:0)

您可以使用capture.output来获取想要的东西。但是,它不与magrittr烟斗发挥出色。以下作品:

library("magrittr") # The package and some toy data
obj <- list(a = list(b = list()), c = list(), d = numeric(10))

capture.output(obj %>% str) %>% View

或者:

obj %>% capture.output(str(.)) %>% View

以下“幼稚”链接无效有效:

obj %>% str %>% capture.output %>% View

答案 2 :(得分:0)

也许您想要类似的东西

View(capture.output(str(x <- 1:5)))

答案 3 :(得分:0)

这是一个应该可以工作的简单函数:

str_tbl <- function(x, n=5) {
  data.frame(Variable = names(x),
             Classe = sapply(x, typeof),
             Values = sapply(x, function(x) paste0(head(x, n = n), 
               collapse = ", ")),
             row.names = NULL)
}

然后只需执行 View(str_tbl(df)),其中 df 是您感兴趣的数据框。