假设我有一个人名的数据框和一些描述它们的分类变量:
df <- data.frame(name = c("Tom", "Jane", "Will", "Joe", "Sarah", "Mary"),
status = c("friend", "acquaintance", "acquaintance", "stranger",
"stranger", "acquaintance"))
我怎样才能打印出格式化的表格(到HTML / LaTeX等),其中的类别是列,名称按行列出(可能按字母顺序排列),如:
理想情况下,我希望能够在R中尽可能多地进行格式化,就像在stargazer
或huxtable
这样的包中一样。
我在想第一步可能是使用tidyr
动词将其重塑为看起来像这样的东西:
df2 <- data.frame(friend = c("Tom", NA, NA),
acquaintance = c("Jane", "Mary", "Will"),
stranger = c("Joe", "Sarah", NA))
然后尝试找到一个很好的格式化和打印功能,但我不确定这是否是正确的方法。谢谢!
这是一个简单的方法。重复但清楚:
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是我的包裹。)
首先,当您创建数据框时,我建议您使用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
希望有所帮助!