Создание отдельных значений из большого набора данных с использованием цикла for в R - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь выяснить, как генерировать отдельные значения из большого набора данных, чтобы я мог ввести значения в таблицу в 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, мне нужно создать каждое из значений по отдельности, чтобы ввести их в таблицу уценки R следующим образом:

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 для генерации столбцов OnTime и Percent в таблице Markdown.

Как бы я поступил так? Буду также признателен за другие подходы к этой проблеме. Спасибо!

1 Ответ

0 голосов
/ 24 мая 2019

Мы можем сделать 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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...