我试图弄清楚如何从大型数据集中生成单个值,以便可以将这些值输入R Markdown中的表中。
例如,我的原始数据集如下所示:
ID Occupation OnTime
1 1 A Y
2 2 B N
3 3 B N
4 4 A Y
5 5 D Y
6 6 C Y
7 7 C N
我想要一个这样的表,该表按职业进行计数:
Occupation Total OnTime Percent
1 A 2 2 100
2 B 2 0 0
3 C 2 1 50
4 D 1 1 100
第二个数据帧中的Total列汇总了每个职业的数量,OnTime列计算了职业A
中Y
中的OnTime
的数量。>
由于我是在R markdown中手动创建此表,因此需要分别创建每个值,以将它们输入到R Markdown表中,如下所示:
Occupation | Total | OnTime | Percent
-----------|--------|---------|--------
A | TotalA | OnTimeA | PercentOnTimeA
B | TotalB | OnTimeB | PercentOnTimeB
C | TotalC | OnTimeC | PercentOnTimeC
D | TotalD | OnTimeD | PercentOnTimeD
如何使用循环有效地做到这一点? 到目前为止,我已经提出了这个建议:
for (i in unique(df$Occupation)) {
df2names <- paste("df1", i,sep=".")
assign(df2names, df1[df1$Occupation==i,])
}
我在上面的代码中需要额外的一行,用于计算刚生成的每个数据帧的长度,以便为TotalA,TotalB,TotalC和TotalD输入值。然后,我将使用类似的for循环在R Markdown表中生成OnTime和Percent列。
我将如何去做?我也将感谢其他解决此问题的方法。谢谢!
答案 0 :(得分:0)
我们可以执行group_by/summarise
来获取汇总值
library(dplyr)
df1 %>%
group_by(Occupation) %>%
summarise(Total = n(), OnTime = sum(OnTime == "Y"), Percent = 100 *OnTime/n())
# A tibble: 4 x 4
# Occupation Total OnTime Percent
# <chr> <int> <int> <dbl>
#1 A 2 2 100
#2 B 2 0 0
#3 C 2 1 50
#4 D 1 1 100
或使用base R
tbl <- table(df1[-1])
cbind(addmargins(tbl, 2), Percent = 100 * prop.table(tbl, 1))[, -c(1, 4)]
df1 <- structure(list(ID = 1:7, Occupation = c("A", "B", "B", "A", "D",
"C", "C"), OnTime = c("Y", "N", "N", "Y", "Y", "Y", "N")),
class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7"))