Переименовать список списка и вывод csv

Я пытаюсь вывести некоторые квантильные результаты из кадра данных на основе этого:

result<- as.data.frame(tapply(df$Nbdays,list(df$Color,df$age),function(x)
round(quantile(x),digit=1)))

Мне нужно, чтобы вывод был примерно таким:

введите здесь описание изображения

при попытке вывести в xls:

write.table(res6,file='ChGenAgebis.xls',sep='\t',row.names=F,na='0',append = T,fileEncoding = "latin1")

Я испытал эту ошибку:

Ошибка в .External2 (C_writetable, x, file, nrow (x), p, rnames, sep, eol,: нереализованный тип «список» в «EncodeElement»

Итак, во-первых, как вывести фрейм данных в xls

Во-вторых, можно ли переименовать список списков вместо:

    str(res6)

    'data.frame':   6 obs. of  5 variables:
     $ [0-25[        :List of 6
      ..$ Yellow : Named num  1.0    4.5    7.0 8.5 12.0
      .. ..- attr(*, "names")= chr  "0%" "25%" "50%" "75%" ...
      ..$ Yellow : Named num  2.0    4.3    7.5 9.5 22.0
      .. ..- attr(*, "names")= chr  "0%" "25%" "50%" "75%" ...
....

Потому что, когда я попытался изменить имя списка столбцов:

result<- as.data.frame(tapply(df$Nbdays,list(df$Color,df$age),function(x)round(quantile(x[,c("Min","1stQuartile","Median","3rdQuartile","Max")]),digit=1)))

у меня есть эта ошибка

Ошибка в x[, c("Min", "1erQuartile", "Median", "3rdQuartile", "Max")]: неверные числа размеров

Любая помощь ?


person freestyle    schedule 27.09.2017    source источник
comment
write.table даст вам file.csv, который Excel может прочитать, но это не file.xls(x). Это то, что вам нужно, или вам нужен настоящий файл Excel?   -  person Nate    schedule 27.09.2017
comment
Я использую xlsx::write.xlsx() для записи файлов Excel.   -  person Richard Lusch    schedule 27.09.2017


Ответы (1)


Вот фрагмент кода, который может быть полезен:

# example data
dat <- data.frame(color=sample(c("Yellow", "Green", "Red"), 100, replace=TRUE), age=sample(c("0-25", "25-50", "50-60"), 100, replace=TRUE), nbDays=rnorm(100), stringsAsFactors=FALSE)
idx <- which(dat[,"color"]=="Red" & dat[,"age"]=="25-50")
dat <- dat[-idx,]

# calculate statistics
myfun <- function(x) quantile(x, names=FALSE, digit=1)
res <- tapply(dat$nbDays, list(dat$color, dat$age), FUN=myfun)

# transform res to data.frame
colors <- c("Yellow", "Green", "Red")
ages <- c("0-25", "25-50", "50-60")
colkeys <- c("Min", "1st Quart.", "Median", "3rd Quart.", "Max")
one_age <- function(age) {
    ans <- res[colors, age]
    for (cl in colors) if(is.null(ans[[cl]])) ans[[cl]] <- rep(NA,5)
    ans <- t(do.call(cbind, ans))
    colnames(ans) <- colkeys
    return(ans)
}
res <- do.call(cbind, lapply(ages, one_age))

Чтобы добавить строку заголовка для возрастов, рассмотрите возможность использования пакета flextable, который поддерживает несколько строк заголовка. Как уже упоминалось в комментариях к вашему вопросу, read.table не может писать в excel, используйте, например. вместо этого пакет xlsx или openxlsx.

person Karsten W.    schedule 27.09.2017
comment
Это действительно то, что я ищу; но теперь я пытаюсь адаптировать его к своей собственной рамке даты, которая уже существует, но имеет значение NULL в моем результате tapply при запуске do.call(): res <- do.call(cbind, lapply(ages, one_age)) Error in (function (..., deparse.level = 1) : номер линии матрицы соответствует (аргумент 3) Итак, как это исправить? - person freestyle; 27.09.2017