类别列和行中观察名称的可打印表

时间:2018-07-19 01:25:16

标签: r html-table tidyr stargazer

假设我有一个人名数据框和一些描述他们的分类变量:

data

我应该如何打印格式表(到HTML / LaTeX等),其中类别是列,名称以行(也许按字母顺序)列出,例如:

enter image description here

理想情况下,我希望能够像使用df <- data.frame(name = c("Tom", "Jane", "Will", "Joe", "Sarah", "Mary"), status = c("friend", "acquaintance", "acquaintance", "stranger", "stranger", "acquaintance")) stargazer这样的软件包在R中进行尽可能多的格式化。

我当时想的第一步可能是使用huxtable动词来重塑它,使其看起来像这样:

tidyr

,然后尝试找到一个好的格式和打印功能,但是我不确定这是否是正确的方法。谢谢!

2 个答案:

答案 0 :(得分:1)

这是一种简单的方法。重复但清晰:

df <- data.frame(name = c("Tom", "Jane", "Will", "Joe", "Sarah", "Mary"),
            status = c("friend", "acquaintance", "acquaintance", "stranger",
            "stranger", "acquaintance"), stringsAsFactors = FALSE)

Friends       <- df$name[df$status == "friend"]
Acquaintances <- df$name[df$status == "acquaintance"]
Strangers     <- df$name[df$status == "stranger"]

max_len <- max(length(Friends), length(Acquaintances), length(Strangers))
length(Friends)       <- max_len
length(Strangers)     <- max_len
length(Acquaintances) <- max_len

tbl <- cbind(Friends, Acquaintances, Strangers)
tbl

##      Friends Acquaintances Strangers
## [1,] "Tom"   "Jane"        "Joe"    
## [2,] NA      "Will"        "Sarah"  
## [3,] NA      "Mary"        NA       

现在您可以使用例如,将其打印到LaTeX / HTML。

library(huxtable)
tbl <- as_hux(tbl, add_colnames = TRUE)
bottom_border(tbl)[1,] <- 1
bold(tbl)[1, ] <- TRUE
tbl

##   Friends   Acquaintances   Strangers  
## ───────────────────────────────────────
##   Tom       Jane            Joe        
##             Will            Sarah      
##             Mary                       
## 
## Column names: Friends, Acquaintances, Strangers

print_latex(tbl) # prints a bunch of TeX code

(全面披露:huxtable是我的包裹。)

答案 1 :(得分:0)

首先,在创建数据框时,建议您使用stringsAsFactors = FALSE,以免将数据转换为因数。

df <- data.frame(name = c("Tom", "Jane", "Will", "Joe", "Sarah", "Mary"),
            status = c("friend", "acquaintance", "acquaintance", "stranger",
            "stranger", "acquaintance"),stringsAsFactors = FALSE)

然后可以使用以下显式函数来获得所需的结果。请注意,数据的结构应与示例中共享的结构相同,以使此功能正常工作。

Restructure<-function(data){
  cols<-unique(data[[2]])
  ls<-vector(mode = "list")
  ln<-vector()
  for(i in 1:length(cols)){
    ls[[i]]<-data[[1]][which(data[[2]] == cols[i])]
    names(ls)[i]<-cols[i]
    ln[i]<-length(ls[[i]])
  }
  mx<-max(ln)
  for(i in 1:length(ls)){
    while(length(ls[[i]]) != mx){
      ls[[i]]<-c(ls[[i]],"")
    }
  }
  res<-as.data.frame(ls)
  return(res)
}

使用此函数将返回以下数据帧。

> Restructure(data = df)
  friend acquaintance stranger
1    Tom         Jane      Joe
2                Will    Sarah
3                Mary         

希望有帮助!