Как посчитать несколько переменных в наборе данных канала, используя функцию grep? - PullRequest
1 голос
/ 12 июня 2019

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

Я использовал следующий код:

#R
NonComp_Strat <- Minor_Behaviours %>% 
filter(Categories == "Non compliant with routine") %>% 
group_by(Strategies) %>% 
summarise(frequency= n())

Однако в моем фрейме данных некоторые ячейки содержат несколько записей, разделенных запятой.

Например,

Он обрабатывает следующие записи поведения по-разному: «Разрушительное» и «Разрушительное, отключить задачу».

Обе записи поведения во фрейме данных имеют переменнуюЯ ищу, но я не знаю, как обернуть функцию grep или grepl в трубу, чтобы подсчитать все отдельные переменные.Их более 20, и выполнение более 20 отдельных функций grep звучит ужасно.Любая помощь очень ценится.

спасибо,

Дан

Ответы [ 3 ]

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

Сначала вам нужно разделить запятые и создать из них новые строки. Тогда вы можете group_by, как вы делали:

library(splitstackshape)
df <- data.frame(id = c(1:4), Strategies = c("Disruptive", "Disruptive, Off Task", "Off Task", "Off Task, Interview"))
df
  id           Strategies
1  1           Disruptive
2  2 Disruptive, Off Task
3  3             Off Task
4  4  Off Task, Interview
df <- cSplit(df, "Strategies", ",", "long")
df
   id Strategies
1:  1 Disruptive
2:  2 Disruptive
3:  2   Off Task
4:  3   Off Task
5:  4   Off Task
6:  4  Interview
0 голосов
/ 12 июня 2019

В более общем смысле мы могли бы разработать функцию разделения, которая выдает reshape данные.

spltCol <- function(x) {
  l <- strsplit(as.character(x), ", ?")
  l <- lapply(l, function(y) c(y, rep(NA, max(lengths(l)) - length(y))))
  return(as.data.frame(do.call(rbind, l)))
}

Пример

df1
#   id                  x          z
# 1  1 alpha, beta, gamma  0.7281856
# 2  2        alpha, beta -0.3149730
# 3  3              alpha -2.6412875
# 4  4               <NA>  0.6412990

df12 <- data.frame(append(df1[-2], spltCol(df1$x)))
#   id          z    V1   V2    V3
# 1  1  0.7281856 alpha beta gamma
# 2  2 -0.3149730 alpha beta  <NA>
# 3  3 -2.6412875 alpha <NA>  <NA>
# 4  4  0.6412990  <NA> <NA>  <NA>

reshape(df12, direction="long", varying=cbind("V1", "V2", "V3"), v.names=names(df1)[2])
#     id          z time     x
# 1.1  1  0.7281856    1 alpha
# 2.1  2 -0.3149730    1 alpha
# 3.1  3 -2.6412875    1 alpha
# 4.1  4  0.6412990    1  <NA>
# 1.2  1  0.7281856    2  beta
# 2.2  2 -0.3149730    2  beta
# 3.2  3 -2.6412875    2  <NA>
# 4.2  4  0.6412990    2  <NA>
# 1.3  1  0.7281856    3 gamma
# 2.3  2 -0.3149730    3  <NA>
# 3.3  3 -2.6412875    3  <NA>
# 4.3  4  0.6412990    3  <NA>

Данные

df1 <- structure(list(id = 1:4, x = structure(c(3L, 2L, 1L, NA), .Label = c("alpha", 
"alpha, beta", "alpha, beta, gamma"), class = "factor"), z = c(0.72818559355044, 
-0.314973049072542, -2.64128753187138, 0.641298995312115)), class = "data.frame", row.names = c(NA, 
-4L))
0 голосов
/ 12 июня 2019

В одном dplyr и tidyr рабочем процессе:

df %>%
    separate(Strategies, paste("Strategies", 1:5, sep = "_"), extra = "drop", sep = ",") %>%
    gather(Stacked, Strategies, Strategies_1:Strategies_5) %>%
    select(-Stacked) %>%
    na.omit() %>%
    mutate(Strategies = as.factor(trimws(Strategies))) %>%
    group_by(Strategies) %>%
    summarise(count = n()) 



  Strategies     count
  <fct>          <int>
1 Brief Time Out     1
2 Detention          2
3 Disruptive         2
4 Interview          1
5 Off Task           1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...