Подстановка номинальных переменных в R

r subset

78 просмотра

2 ответа

У меня есть набор данных, похожий на этот:

x <- sample(c("A", "B", "C", "D"), 1000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05))
y <- sample(1:40, 1000, replace=TRUE)
d <- data.frame(x,y)

str(d)
'data.frame':   1000 obs. of  2 variables:
$ x: Factor w/4 levels "A","B","C","D": 1 3 3 2 3 3 3 3 4 3 ...
$ y: int  28 35 14 4 34 36 30 35 26 9 ...

table(d$x)
A   B   C   D 
115 204 637 44 

Так что в моем реальном наборе данных у меня есть несколько тысяч этих категорий (A, B, C, D).

str()Мои реальных данных

str(realdata)
data.frame':    346340 obs. of  91 variables:
$ author       : Factor w/ 42590 levels "-jon-","--LZR--",..: 1962 3434 1241 7666 6235 2391 1196 2779 1881 339 ...
$ created_utc  : Factor w/ 343708 levels "2015-05-01 02:00:41",..: 14815 23163 2281 3569 5922 7211 15783 5512 13485 8591 ...
$ group    : Factor w/ 5 levels "xyz","abc","bnm",..: 2 2 2 2 2 2 2 2 2 2 ...
....

Теперь я хочу , чтобы подмножество данных, так что я только строки этих авторов $ (или $xв ddataframe) в моем новом dataframe , которые имеют более чем 100 записей в общей сложности.

Я попробовал следующее:

dnew <- subset(realdata, table(realdata$author) > 100)

Это дает мне результат, но, похоже, не все записи авторов были включены. Хотя это должно быть намного больше, я просто получаю 1,3% строк полного набора данных. Я проверил это вручную (с Excel), и это должно быть гораздо больше (около 30%). Ручной анализ показал, что 1,2% от $ author составляют 30% записей. Похоже, он просто дал мне одну строку с $ author, у которого более 100 записей, но не все его записи.

Вы знаете, как это исправить?

Автор: Arthur Pennt Источник Размещён: 08.11.2019 11:03

Ответы (2)


1 плюс

Решение

I. Фрейм данных dс четырьмя уровнями

  table(d$x)

  #  A   B   C   D 
  # 92 232 630  46 

II. Проверка, какой уровень имеет более 100 записей

  which(table(d$x)>100)
  # B C 
  # 2 3 

III. Поднабор dфрейма данных, имеющий только записи, принадлежащие уровням, которые имеют более 100 записей, т.е. level Bа такжеlevel C

  result <- d[ d$x %in%  names(table(d$x))[table(d$x) > 100] , ]
  dim(result)
  # [1] 862   2

  str(result)
  # 'data.frame':   862 obs. of  2 variables:
  #  $ x: Factor w/ 4 levels "A","B","C","D": 3 2 3 3 2 2 2 3 3 3 ...
  #  $ y: int  29 32 27 40 30 38 8 16 2 23 ...

Уровень Aи Dдо сих пор сохраняется с0 records

  table(result$x)

  #   A   B   C   D 
  #   0 232 630   0 

Внутривенно Удаление уровней с 0 записями, используяfactor()

  result$x <- factor(result$x)

  str(result)
  # 'data.frame':   860 obs. of  2 variables:
  #  $ x: Factor w/ 2 levels "B","C": 2 2 1 2 1 2 2 2 1 2 ...
  #  $ y: int  29 32 27 40 30 38 8 16 2 23 ...

  table(result$x)
  #   B   C 
  # 232 630 
Автор: Sowmya S. Manian Размещён: 20.08.2016 08:34

3 плюса

Мы можем сделать это легко с data.table. Преобразовать data.frame в data.table ( setDT(d)сгруппированный по x, ifколичество наблюдений больше 100, мы подмножество Data.table ( .SD)

library(data.table)
ddt <- setDT(d)[, if(.N > 100) .SD, x]

Или, если мы используем dplyr, можно использовать тот же подход.

library(dplyr)
dpl <- d %>%
        group_by(x) %>%
        filter(n() > 100) %>%
        droplevels()
str(dpl)
#Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 866 obs. of  2 variables:
#$ x: Factor w/ 2 levels "B","C": 1 1 2 1 1 2 2 2 2 2 ...
# $ y: int  25 25 13 11 2 32 12 15 12 3 ...

Кроме того, при использовании base R, tableможет быть полезным

v1 <- table(d$x)
d1 <- subset(d, x %in% names(v1)[v1 > 100])

Так как столбец «х» factor, когда мы subsetнабор данных, уровни сохраняются, чтобы удалить это использованиеdroplevels

d2 <- droplevels(d1)

Поскольку ОП не установил seed, выход будет отличаться для каждого человека.

str(d2)
#'data.frame':   866 obs. of  2 variables:
#$ x: Factor w/ 2 levels "B","C": 1 1 2 1 1 2 2 2 2 2 ...
#$ y: int  25 25 13 11 2 32 12 15 12 3 ...
Автор: akrun Размещён: 20.08.2016 08:14
Вопросы из категории :
32x32