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

问题描述 投票:2回答:2

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

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

我怎样才能打印出格式化的表格(到HTML / LaTeX等),其中的类别是列,名称按行列出(可能按字母顺序排列),如:

enter image description here

理想情况下,我希望能够在R中尽可能多地进行格式化,就像在stargazerhuxtable这样的包中一样。

我在想第一步可能是使用tidyr动词将其重塑为看起来像这样的东西:

df2 <- data.frame(friend = c("Tom", NA, NA),
              acquaintance = c("Jane", "Mary", "Will"),
              stranger = c("Joe", "Sarah", NA))

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

r html-table tidyr stargazer
2个回答
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是我的包裹。)


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         

希望有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.