假设我有一个人名数据框和一些描述他们的分类变量:
data
我应该如何打印格式表(到HTML / LaTeX等),其中类别是列,名称以行(也许按字母顺序)列出,例如:
理想情况下,我希望能够像使用df <- data.frame(name = c("Tom", "Jane", "Will", "Joe", "Sarah", "Mary"),
status = c("friend", "acquaintance", "acquaintance", "stranger",
"stranger", "acquaintance"))
或stargazer
这样的软件包在R中进行尽可能多的格式化。
我当时想的第一步可能是使用huxtable
动词来重塑它,使其看起来像这样:
tidyr
,然后尝试找到一个好的格式和打印功能,但是我不确定这是否是正确的方法。谢谢!
答案 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
希望有帮助!