Создайте xtable фрейма данных, содержащего логические значения

#r

#r

Вопрос:

Я хочу использовать xtable для отображения простого фрейма данных, содержащего два вектора с логическими значениями:

 ia = c(TRUE, TRUE, FALSE)
ib = c(FALSE, TRUE, TRUE)
i.df = data.frame(ia, ib)
xtable(i.df)
  

Это приводит к:

 begin{table}[ht]
begin{center}
begin{tabular}{rll}
  hline
 amp; ia amp; ib  
  hline
1 amp; c(TRUE, TRUE, FALSE) amp; c(FALSE, TRUE, TRUE)  
  2 amp; c(FALSE, TRUE, TRUE) amp; c(TRUE, TRUE, FALSE)  
  3 amp; c(TRUE, TRUE, FALSE) amp; c(FALSE, TRUE, TRUE)  
   hline
end{tabular}
end{center}
end{table}
  

Однако я бы ожидал:

 begin{table}[ht]
begin{center}
begin{tabular}{rll}
  hline
 amp; ia amp; ib  
  hline
1 amp; TRUE amp; FALSE  
  2 amp; TRUE amp; TRUE  
  3 amp; FALSE amp; FALSE  
   hline
end{tabular}
end{center}
end{table}
  

По какой-то причине xtable печатает полные логические векторы в каждой строке, вместо того, чтобы печатать только один элемент в строке. Имеет ли это смысл для кого-либо или я упускаю из виду что-то явно очевидное?

Ответ №1:

Для меня это похоже на ошибку. Соответствующие строки в xtable.data.frame :

 logicals <- unlist(lapply(x, is.logical))
x[, logicals] <- as.character(x[, logicals])
  

Это не то, как я бы сделал это принуждение к символу. Я бы, вероятно, сделал что-то вроде:

 x[,logicals] <- lapply(x[,logicals],as.character)
  

Я бы подумал о том, чтобы связаться с автором пакета. В то же время, вы можете попробовать преобразовать логические столбцы в символы заранее, самостоятельно, так как это, скорее всего, решит проблему за это время.

Редактировать

Комментарий Романа ниже предупредил меня о том, что предложенное мной исправление не будет работать, если есть только один логический столбец, поскольку измерения по умолчанию отбрасываются. Это должно было быть:

 x[,logicals] <- lapply(x[,logicals,drop = FALSE],as.character)
  

Я связался с сопровождающим пакета по этому поводу (2012-04-22).

Комментарии:

1. Большое спасибо! Преобразование в символы с помощью i.df$ia = as.character(i.df$ia) отлично работает как обходной путь. Я также отправил электронное письмо автору пакета.