Чистые решения для рядовых операций, которые удовлетворяют условию - PullRequest
0 голосов
/ 18 июня 2019

Я застрял в том, как разработать аккуратное решение, которое будет выглядеть построчно, чтобы увидеть, выполняется ли условие уникально в каждой строке.

В частности, у меня есть данные ответов на опросы, в которых используются рейтинговые шкалы. Количество категорий в шкале оценок может варьироваться в зависимости от предметов. Мои данные в широком формате.

Пример данных приведен ниже.

  • В этих данных столбец под названием «Элемент» индексирует каждый элемент опроса.
  • Столбцы с названиями от «Cat_1» до «Cat_5» являются категориями шкалы оценок для всех предметов. Значения в этих ячейках представляют процент респондентов, одобряющих категорию шкалы оценок. Элемент 1 имеет 5 допустимых категорий в шкале оценок, поэтому значения присутствуют в столбцах с «Cat_1 по« Cat_5 ». Item_2 имеет 4 категории шкалы оценки. NA в 'Cat_5' для Item_2 указывает на то, что это недопустимая категория шкалы оценок для этого элемента.
  • Столбец, озаглавленный «Percent_missing», представляет собой процент пропущенных данных для каждого элемента (предоставляется для имитации реального применения данных).
  • Столбец с именем «flr_ceil» - это пороговое значение, которое я хочу использовать, чтобы увидеть, превышает ли первая или последняя действительная категория шкалы оценок для каждого элемента свой порог.

В идеале я хотел бы добавить столбец с именем «thresh_met», который кодируется либо 0/1, в зависимости от того, превышает ли первая или последняя действительная категория шкалы оценок для каждого элемента свой порог. Например, для «Item_1» значение для «thresh_met» будет равно 1, так как Cat_1 == 33, что превышает его пороговое значение 25. Это отличается от Item_2, где значение для «thresh_met» = 0, поскольку ни значение Cat_1 или Cat_4 превышают пороговое значение 22.

Данные выглядят примерно так:

Items  | Cat_1  |  Cat_2  |  Cat_3  |  Cat_4  |  Cat_5  |  Percent_missing | flr_ceil         |
Item_1 | 33     |  23     | 23      |  21     |  0      |   2              | 25               |
Item_2 | 20     |  30     | 20      |  10     |  NA     |   4              | 22               |

Код, который я разработал, приведен ниже. Должно быть понятно, где я застрял. В этом коде порог, который я хочу использовать, помечен как 'flr_ceil.'

Код:

# load packages and create data
if(!require("pacman"))install.packages("pacman")
p_load(tidyverse, magrittr, mice)

sample_dat <- tibble(
  Item_1 = sample(0:4, 100, replace = TRUE, prob = c(0.1, 0.2, 0.4, 0.2, 0.1)),
  Item_2 = sample(0:4, 100, replace = TRUE, prob = c(0.4, 0.2, 0.05, 0.2, 0.15)),
  Item_3 = sample(0:5, 100, replace = TRUE, prob = c(0.2, 0.2, 0.1, 0.2, 0.1, 0.2)),
  Item_4 = sample(0:4, 100, replace = TRUE, prob = c(0.6, 0.1, 0.2, 0.05, 0.05))) %>%
  mice::ampute(prop = .25) %$%
  amp

# get the valid number of categories for each item
col_names <- colnames(sample_dat) # for sorting at end of the pipe

cat_counts <-  sample_dat %>% 
  gather(key = Item, value = rating)  %>% 
  group_by(Item, rating) %>%
  summarise(
    n = n()) %>%
  group_by(Item) %>%
  summarise(
    flr_ceil = (1/n())*100
  ) %>%
  arrange(match(Item, col_names))

sample_dat %>% 
  gather(key = Item, value = rating)  %>% 
  group_by(Item, rating) %>%
  summarise(
    n = n()) %>%
  mutate(
    prop = (n/sum(n))*100
  ) %>%
  select(Item, rating, prop) %>%
  spread(rating, prop) %>%
  arrange(match(Item, col_names)) %>%
  left_join(cat_counts) 

1 Ответ

1 голос
/ 19 июня 2019

Ниже приведено полезное решение:

  1. Преобразование данных (df) в длинный формат с одной строкой для каждого Item и Category
  2. Удалить строки с NA значениями
  3. Группировка по Item и упорядочение строк по Category name
  4. Проверьте, превышает ли первое или последнее значение категории пороговое значение в flr_ceil

Вы можете добавить новый столбец thresh_met обратно к df с помощью вызова join или mutate.

library(tidyverse)

## df is generated using the code in the question
df
#> # A tibble: 4 x 8
#> # Groups:   Item [4]
#>   Item   Cat_1 Cat_2 Cat_3 Cat_4 Cat_5 Cat_6 flr_ceil
#>   <chr>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>    <dbl>
#> 1 Item_1    10    20    34   25      4    NA     16.7
#> 2 Item_2    43    15     5   23     11    NA     16.7
#> 3 Item_3    21    18     6   17     10    20     14.3
#> 4 Item_4    51    16    19    7.     2    NA     16.7

gather(df, key = "Category", value = "Value", starts_with("Cat")) %>%    
    na.omit() %>%                                                        
    group_by(Item) %>%                                                  
    arrange(Category) %>%                                               
    summarize(thresh_met = as.integer(any(Value[c(1, n())] > flr_ceil[c(1, n())])))
#> # A tibble: 4 x 2
#>   Item   thresh_met
#>   <chr>       <int>
#> 1 Item_1          0
#> 2 Item_2          1
#> 3 Item_3          1
#> 4 Item_4          1

Создано в 2019-06-19 с помощью пакета Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...