Подтвердить что ты не робот

Быстрое представление R data.frame, vector или data.table в Excel

Как вы быстро открываете небольшие табличные/векторные объекты R в Excel?

Например, предположим, что у вас есть следующие три объекта, которые вы хотите просмотреть в Excel:

## A data frame with commas and quotes
df = data.frame(
  area = unname(state.x77[,'Area']),
  frost = unname(state.x77[,'Frost']),
  comments = "Ok for a visit, but don't want to live there",
  challengeComments = c('"', '""'))
row.names(df) = state.name
df = df[1:10, ]
df['California', 'comments'] = "Would like to live here"

## A Matrix
mat = matrix(rnorm(100), 10)

## A Vector
v = 1:10
4b9b3361

Ответ 1

Я написал эту функцию для выполнения этой задачи. Я называю это "написать временный файл" или "wtf". Он работает только с окнами, если у вас есть файлы csv, связанные с Excel.

Вы можете посмотреть код в PBSmodelling:: openFile, чтобы узнать, как его перенести в разные операционные системы.

wtf = function (x) {
  tempFilePath = paste(tempfile(), ".csv")
  tempPath = dirname(tempFilePath)
  preferredFile = paste(deparse(substitute(x)), ".csv", sep = "")
  preferredFilePath = file.path(tempPath, preferredFile)

  if(length(dim(x))>2){
    stop('Too many dimensions')
  }
  if(is.null(dim(x))){
    x = as.data.frame(x)
  }
  if (is.null(rownames(x))) {
    tmp = 1:nrow(x)
  }else {
    tmp = rownames(x)
  }
  rownames(x) = NULL
  x = data.frame(RowLabels = tmp, x)
  WriteAttempt = try(
    write.table(x, file=preferredFilePath, quote=TRUE, sep=",", na="",
                row.names=FALSE, qmethod="double"),
    silent = TRUE)
  if ("try-error" %in% class(WriteAttempt)) {
    write.table(x, file=tempFilePath, , quote=TRUE, sep=",", na="",
                row.names=FALSE, qmethod="double")
    shell.exec(tempFilePath)
  } else {
    shell.exec(preferredFilePath)
  }
}


wtf(df)
wtf(mat)
wtf(v)

Если вы открываете один и тот же объект несколько раз, он все равно будет работать благодаря обработке ошибок, но у него будет грязное имя temp.

wtf(df)
df$MoreData = pi
wtf(df)

Ответ 2

Я написал функцию для открытия файлов в Libre Office Calc или Excel. Подробнее см. здесь.

view <- function(data, autofilter=TRUE) {
    # data: data frame
    # autofilter: whether to apply a filter to make sorting and filtering easier
    open_command <- switch(Sys.info()[['sysname']],
                           Windows= 'open',
                           Linux  = 'xdg-open',
                           Darwin = 'open')
    require(XLConnect)
    temp_file <- paste0(tempfile(), '.xlsx')
    wb <- loadWorkbook(temp_file, create = TRUE)
    createSheet(wb, name = "temp")
    writeWorksheet(wb, data, sheet = "temp", startRow = 1, startCol = 1)
    if (autofilter) setAutoFilter(wb, 'temp', aref('A1', dim(data)))
    saveWorkbook(wb, )
    system(paste(open_command, temp_file))
}

Ответ 3

Извините за бесстыдную рекламу... Вы можете попробовать мой пакет http://cran.r-project.org/web/packages/excel.link/index.html Это выглядит так:

library(excel.link)
xlrc[a1]=df

Это зависит от пакета Omegahat RDCOMClient, поэтому необходимо установить его из источника:

install.packages("RDCOMClient", repos = "http://www.omegahat.org/R")
install.packages("excel.link", repos = "http://cran.at.r-project.org",type="source")

Ответ 4

Я часто использую это, чтобы вставить таблицу данных в Excel:

write.table(x, "clipboard", row.names=F, sep='\t')

И чтобы скопировать (под) таблицу из Excel в R, сделайте это (если в таблице есть строка заголовка):

read.csv('clipboard', sep='\t')

Ответ 5

Решение geneorama прекрасно, но использование write.table делает его очень медленным. Вы можете изменить это на fwrite из пакета data.table.

Основная причина это решение является полезным (по крайней мере для меня), потому что View страшно с большим dataframes. Я протестировал решение geneorama с кадром данных 15600 единиц. на 1270 переменных, и он открылся через 16 секунд. В версии fwrite он открылся через 0,6 секунды!

Вот модифицированная функция:

wtf = function (x) {
  tempFilePath = paste(tempfile(), ".csv")
  tempPath = dirname(tempFilePath)
  preferredFile = paste(deparse(substitute(x)), ".csv", sep = "")
  preferredFilePath = file.path(tempPath, preferredFile)

  if(length(dim(x))>2){
    stop('Too many dimensions')
  }
  if(is.null(dim(x))){
    x = as.data.frame(x)
  }
  if (is.null(rownames(x))) {
    tmp = 1:nrow(x)
  }else {
    tmp = rownames(x)
  }
  rownames(x) = NULL
  x = data.frame(RowLabels = tmp, x)
  WriteAttempt = try(
    data.table::fwrite(x, file=preferredFilePath, quote=TRUE),
    silent = TRUE)
  if ("try-error" %in% class(WriteAttempt)) {
    data.table::fwrite(x, file=tempFilePath, quote=TRUE)
    shell.exec(tempFilePath)
  } else {
    shell.exec(preferredFilePath)
  }
}

Ответ 6

Используйте write.csv(x, "clipboard") и вставьте в excel.

Ответ 7

Я написал функцию для окон. Но, вероятно, он также работает и в других операционных системах.

Он создает временные файлы в папке C:\Users \...\Documents\Rview и открывает их с помощью функции browseURL(). Вы можете открыть до 99 файлов параллельно. Вы можете легко выбрать, какие dimnames должны отображаться с помощью аргументов "имена". Функция добавит 'before +, -, = в col/rownames, чтобы она отображалась правильно в Excel.

Я лично предпочитаю решение с помощью Sys.getenv( "TMP" ) по использованию tempfile(), потому что tempfile() будет испортить вашу папку временных файлов через определенный промежуток времени.

Для получения дополнительной информации см. описания аргументов в верхней части кода.

# This function creates a CSV file from a data.frame/matrix and opens it with the default CSV-opening-program
# of the computer.
#
# x = data.frame/matrix
# names = dimnames to be saved in the file. "col"=colnames, "rowcol"=rownames&colnames, "row"=rownames, "no"=no dimnames
# nrows = maximum number of rows    to be saved (for higher speed with large datasets)
#         if n=-1, all rows will be displayed.-> see also the help for read.table()
# ncols = maximum number of columns to be saved (for higher speed with large datasets)
# folder = directory, where the temporary file should be saved.
#          If NULL an accessible folder in C:/Users/.../Documents will be created automatically.
# quote = should quotes be written into the csv File? -> see also the help for write.table()
# na = how should NA values be displayed in the csv File? -> see also the help for write.table()
# openfolder = Should the folder with all temporary files be opened after having created the file?

view <- function(x, names=c("col","rowcol","row","no"), nrows=10000, ncols=1000, folder=NULL, quote=FALSE, na="NA", openfolder=FALSE, ...){

  names <- match.arg(names)
  if(is.null(dim(x))) {
    x <- as.matrix(x)
  }
  if(is.null(colnames(x))) colnames(x) <- paste0("V",1:ncol(x))

  if(nrows<0) nrows <- nrow(x)
  if(ncols<0) ncols <- ncol(x)
  # Shrink data.frame such that it can be saved & viewed faster.
  nrows <- min(nrow(x), nrows)
  if(nrows!=nrow(x)) x <- x[1:nrows,,drop=FALSE]
  ncols <- min(ncol(x), ncols)
  if(ncols!=ncol(x)) x <- x[,1:ncols,drop=FALSE]


  # Define paths
  # If is.null(folder), wird ein temporaerer Ordner im Windows-Dateisystem angelegt.
  if(is.null(folder)) {
    folder <- paste0(Sys.getenv("TMP"), "\\Rview")
    suppressWarnings( dir.create(folder) )
  }  

  # Wenn am Schluss des Pfades kein "/" angefuegt wurde, wird dies gemacht:
  if( !substr(folder,nchar(folder),nchar(folder))%in%c("/","\\") ) folder <- paste0(folder, "\\")
  pfad0 <- folder
  name <- "Rview_tmp"
  nr <- "01"
  csv <- ".csv"

  # Check if there are existing files in the folder
  fil <- list.files(pfad0)
  # If there are no files in the folder, use the default save path.
  if(length(fil)==0){
    pfad1 <- paste0(pfad0, name, nr, csv)
  } else {
    # Remove all files in the folder (if possible)
    fil <- paste0(pfad0, fil)
    suppressWarnings( try( file.remove( fil )  , silent=TRUE) )
    fil <- list.files(pfad0)
    # If there are no files anymore use the default save path.
    if( length(fil)==0 ) {
      pfad1 <- paste0(pfad0, name, nr, csv)
    } else {
      # If there are sill files, read out the number of the newest file (with the highest number)
      ncharfil <- nchar(fil)
      mx <- max( as.numeric( substr(fil,ncharfil-5,ncharfil-4) ) )
      # Add 1 to the number of the file
      mxpl1 <- as.character( mx+1 )
      if(nchar(mxpl1)==1) mxpl1 <- paste0("0",mxpl1)
      # Create a new path
      pfad1 <- paste0(pfad0, name, mxpl1, csv)
    }
  }

  # Rownames und colnames, die mit +, - oder = anfangen, mit ' am Anfang versehen, dass es von Excel richtig dargestellt wird
  rn1 <- rownames(x)
  cn1 <- colnames(x)
  ind <- substr(rn1,1,1)%in%c("+","-","=")
  if(any(ind)) rownames(x)[ind] <- paste0(" ",rn1[ind])
  ind <- substr(cn1,1,1)%in%c("+","-","=")
  if(any(ind)) colnames(x)[ind] <- paste0(" ",cn1[ind])

  # Write CSV file & open.
  if(names=="row") {
    # If the first cell of the file is named "ID" Microsoft Excel warns that a SYLK file is opened. Therefore it is renamed.
    if(rownames(x)[1]=="ID") rownames(x)[1] <- "lD"
    write.table(x, file=pfad1, sep = ";", col.names=FALSE, row.names=TRUE, quote=quote, na=na, ...)
  } else if (names=="col") {
    # If the first cell of the file is named "ID" Microsoft Excel warns that a SYLK file is opened. Therefore it is renamed.
    if(colnames(x)[1]=="ID") colnames(x)[1] <- "lD"
    write.table(x, file=pfad1, sep = ";", col.names=TRUE, row.names=FALSE, quote=quote, na=na, ...)
  } else if (names=="rowcol") {
    write.table(x, file=pfad1, sep = ";", col.names=NA)                    # Colnames & Rownames
  } else {
    write.table(x, file=pfad1, sep = ";", col.names=FALSE, row.names=FALSE, quote=quote, na=na, ...)
  }

  browseURL(pfad1)
  if(openfolder) {
    Sys.sleep(1)
    browseURL(folder)
  }
}

Ответ 8

Не совсем отвечает на вопрос, так как это не ограничивается Excel, но вот простая функция (вдохновленная некоторыми другими ответами), которая создает временный CSV файл из объекта и копирует его путь в буфер обмена (с помощью пакета clipr),

Это позволяет быстро визуализировать объект в любом приложении (например, sc-im, Libreoffice calc, Excel, Gnumeric и т.д.), Просто введя имя выбранного приложения и вставив содержимое буфера обмена в командную строку.

ext <- function(data) {
    file_name <- tempfile(fileext = ".csv")
    file <- write.csv(data, file_name)
    clipr::write_clip(paste(file_name))
}

Сначала я прибег к этому, потому что я изо всех сил пытался заставить sc-im открыть файл из R с помощью system(), но в конце я нахожу очень удобным иметь возможность выбрать приложение, которое я хочу использовать для визуализации временный файл: в зависимости от объекта, который я хочу исследовать, более подходящим может быть то или иное приложение.