Я пытаюсь создать таблицу частот, где Var1 использует только одно значение, а Var3 не отображается в таблице, а фильтрует данные в таблице. - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь создать таблицу частот, где VAR1 - это некоторые, но не все значения, а VAR3 фильтрует, какие строки используются для создания таблицы.

ISCED - это Var1, и я хочу только значения 12 и 15 Если возможно, я не хочу видеть ЛОЖЬ в моей таблице. Во-вторых, я хочу использовать только те строки, где PK_T = 1. Не могу понять, как это сделать.

My DF 
ISCED    EMTAK    PK_T  
 12       233      1
 12       245      0
 12       233      NA
 13       233      1
 15       433      1
 15       245      0
I want
ISCED   EMTAK  Freq
 True    233    1
 True    245    0
 True    433    1

Ответы [ 3 ]

0 голосов
/ 15 апреля 2020

Используя ваши данные и пакет data.table, я делю данные на те, где ISCED равен 12 или 15, группирую по EMTAK и PK_T == 1, а затем использую .N для подсчета количества вхождений, затем я чередую второе выражение, ограниченное теми, где ISCED равен TRUE. Заметьте, что я также удаляю переменную PK_T из финальной таблицы - это бессмысленно, поскольку в переменной нет изменений.

library(data.table)
dt1[ISCED %in% c(12, 15), .N, by = .(EMTAK, PK_T == 1)][PK_T == TRUE, -"PK_T"]

Предоставление

   EMTAK N
1:   233 1
2:   433 1

Какой правильный ответ с вашими данными есть только одно вхождение 233, где PK_T равно 1, другое вхождение это NA.

Базовый эквивалент R будет

table(df1[df1$ISCED %in% c(12, 15) & df1$PK_T == 1, "EMTAK"])
0 голосов
/ 15 апреля 2020

Если мы предположим, что ваш набор данных такой, как вы его представили:

myDF <- data.frame(ISCED=c(12, 12, 12, 13, 15, 15), EMTAK=c(233, 245, 233, 233, 433, 245), PK_T=c(1, 0, NA, 1, 1, 0))

Затем, используя только пакет dplyr и таблицу () из baseR, вы можете сделать:

install.packages("dplyr")
library(dplyr)

newDF <- myDF %>%
  na.omit %>%                        # remove NA values
  filter(PK_T==1) %>%
  filter(ISCED==12 | ISCED==15) %>%
  select(EMTAK) %>%                  # drop the column ISCED
  mutate(Freq= table(.$EMTAK))       # mutate() creates the new column "Freq"

Предоставление:

  EMTAK      Freq
1   233         1
2   433         1

Если вы хотите создавать другие комбинации, вы настраиваете аргументы внутри фильтра ()

0 голосов
/ 15 апреля 2020

Вы можете использовать table для получения частоты c. Чтобы включить 0 раз, вы можете использовать as.factor. Вы можете использовать [ для подмножества случаев, когда x$PK_T==1. Чтобы получить только те значения ISCED, которые равны 12 или 15, вы можете использовать %in%:

y <- table(as.factor(x$EMTAK)[x$ISCED %in% c(12, 15) &
   !is.na(x$PK_T) & x$PK_T==1])
data.frame(ISCED = TRUE, EMTAK = names(y), Freq = as.vector(y))
#  ISCED EMTAK Freq
#1  TRUE   233    1
#2  TRUE   245    0
#3  TRUE   433    1

или использовать aggregate, только если выполняются все условия.

aggregate(cbind(Freq=PK_T) ~ EMTAK, x[x$ISCED %in% c(12, 15) &
  !is.na(x$PK_T) & x$PK_T==1,], length)
#  EMTAK Freq
#1   233    1
#2   433    1

Данные:

x <- read.table(header=TRUE, text="ISCED    EMTAK    PK_T  
 12       233      1
 12       245      0
 12       233      NA
 13       233      1
 15       433      1
 15       245      0")
...