使用R中的for循环从大型数据集中创建单个值

时间:2019-05-24 05:03:17

标签: r

我试图弄清楚如何从大型数据集中生成单个值,以便可以将这些值输入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列计算了职业AY中的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列。

我将如何去做?我也将感谢其他解决此问题的方法。谢谢!

1 个答案:

答案 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"))