满足条件的按行操作的整洁解决方案

时间:2019-06-18 19:03:50

标签: r tidyverse

我坚持如何开发一个整洁的解决方案,该解决方案将逐行查看是否在每一行中唯一满足条件。

具体来说,我有使用等级量表的调查回复数据。评分量表中的类别数可能因项目而异。我的数据格式很宽。

数据样本如下。

  • 在这些数据中,标题为“项目”的列对每个调查项目进行索引。
  • 标题为“ Cat_1”至“ Cat_5”的列是各个项目的评分等级类别。这些单元格中的值代表认可评级量表类别的受访者的百分比。项目1在等级量表中有5个有效类别,这就是为什么值显示在标题为“ Cat_1至Cat_5”的列中的原因。 Item_2可能有4个等级量表类别。项目_2的“ Cat_5”中的NA表示这不是该项目评分等级的有效类别。
  • 标题为“ Percent_missing”的列是每个项目的缺失数据百分比(用于模拟现实世界中的数据应用)。
  • 标题为“ flr_ceil”的列是我想用来查看每个项目的第一个或最后一个有效评分等级类别是否超过其阈值的阈值。

理想情况下,我想添加一个称为“ thresh_met”的列,该列基于每个项目的第一个或最后一个有效评分等级类别是否超过其阈值而编码为0/1。例如,对于“ Item_1”,由于Cat_1 == 33,因此“ thresh_met”的值将为1,这大于其阈值25。这与Item_2相对,“ Item_1”的值“ 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 个答案:

答案 0 :(得分:1)

下面的整理方法可能会有所帮助:

  1. 将数据(#include <stdio.h> #include <string.h> #include <conio.h> int main() { int finish = 0, longest=0, smallest=0, count =0; char word[20], smallest_word[20], largest_word[20]; while (0 == finish) { printf("enter word:\t"); scanf("%s", word); if (count == 0) { strcpy(smallest_word, word); strcpy(largest_word, word); count++; continue; //To ensure in first time loop ends here } if (strcmp(word, smallest_word)<0) strcpy(smallest_word, word); else if (strcmp(word, largest_word) > 0) strcpy(largest_word, word); if (strlen(word) == 4) { finish++; } count++; } printf("smallest word: %s\n", smallest_word); printf("largest word: %s\n", largest_word); getch(); return 0; } 转换为长格式,并且每个dfItem都使用一行
  2. 使用Category值删除行
  3. NA分组并按Item名称排列行
  4. 检查第一个或最后一个类别值是否超过Category中的阈值

您可以通过flr_ceilthresh_met调用将新列df添加回join

mutate

reprex package(v0.3.0)

创建于2019-06-19