R Как считать возникновение уровней факторов - PullRequest
0 голосов
/ 18 октября 2019

У меня есть данные в следующем формате:

ID    Task1   Task2   Task3   Task4
abc   Hard    Hard    Mix     Hard              
xyz   Easy    Mix     Easy    Hard               
als   Mix     Hard    Easy    Hard               
bld   Hard    Mix     Easy    Easy               
cqr   Hard    Easy    Hard    Hard               
alx   Hard    Hard    Hard    Hard               

Для каждого ID мне интересно подсчитать вхождение каждого факторного уровня в отдельности - Hard, Mix и Easy в этомслучай (см. ниже). Я хочу иметь подсчет общего числа вхождений для каждого идентификатора для каждого фактора, а затем я также хочу иметь счетчик максимального количества последовательных вхождений для этого идентификатора для этого фактора, например,

ID    Task1   Task2   Task3   Task4   Hard_Total   Max_Consecutive_Hard
abc   Hard    Hard    Mix     Hard    3            2
xyz   Easy    Mix     Easy    Hard    1            1
als   Mix     Hard    Easy    Hard    2            1
bld   Hard    Mix     Easy    Easy    1            1
cqr   Hard    Easy    Hard    Hard    3            2
alx   Hard    Hard    Hard    Hard    4            4

Может ли кто-нибудь предложить решениеthis?

dput () для данных примера ниже.

structure(list(ID = structure(c(1L, 6L, 2L, 4L, 5L, 3L), .Label = c("abc","als", "alx", "bld", "cqr", "xyz"), class = "factor"), Task1 = structure(c(2L, 1L, 3L, 2L, 2L, 2L), .Label = c("Easy", "Hard", "Mix"), class = "factor"), Task2 = structure(c(2L, 3L, 2L, 3L, 1L, 2L), .Label = c("Easy", "Hard", "Mix"), class = "factor"), Task3 = structure(c(3L, 1L, 1L, 1L, 2L, 2L), .Label = c("Easy", "Hard", "Mix"), class = "factor"), Task4 = structure(c(2L, 2L, 2L, 1L, 2L, 2L), .Label = c("Easy", "Hard"), class = "factor")), class = "data.frame", row.names = c(NA, -6L))

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Сначала мы создаем функции, чтобы получить оба нужных столбца fun_hard и fun_max. fun_hard() вычисляет количество «жестких» появлений на входе, в то время как fun_max() вычисляет максимальное количество последовательных «жестких» появлений на входе, используя rle().

fun_hard = function(x) {
  sum(x=="Hard")
}

fun_max = function(x) {
  rle_hard <- rle(x)
  max(rle_hard$lengths[rle_hard$values == "Hard"])
}

Мы используем apply() для использования fun_hard() иfun_max() в каждой строке данного df.

test_df$Hard_Total = apply(test_df[,c(2,3,4,5)], MARGIN = 1, FUN = fun_hard)
test_df$Max_Consecutive_Hard = 
              apply(test_df[,c(2,3,4,5)], MARGIN = 1, FUN = fun_max)

Вывод:

  ID Task1 Task2 Task3 Task4 Hard_Total Max_Consecutive_Hard
1 abc  Hard  Hard   Mix  Hard          3                    2
2 xyz  Easy   Mix  Easy  Hard          1                    1
3 als   Mix  Hard  Easy  Hard          2                    1
4 bld  Hard   Mix  Easy  Easy          1                    1
5 cqr  Hard  Easy  Hard  Hard          3                    2
6 alx  Hard  Hard  Hard  Hard          4                    4
1 голос
/ 18 октября 2019

Вы можете использовать rowSums(), чтобы получить общее количество Hard значений по строкам, а затем использовать rle() по строкам, чтобы получить самый длинный пробег:

transform(df, Hard_Total = rowSums(df[paste0("Task", 1:4)] == "Hard", na.rm = TRUE),
              Max_Consecutive_Hard = apply(df[paste0("Task", 1:4)], 1, function(x) with(rle(x), max(lengths[values == "Hard"], na.rm = TRUE))))

   ID Task1 Task2 Task3 Task4 Hard_Total Max_Consecutive_Hard
1 abc  Hard  Hard   Mix  Hard          3                    2
2 xyz  Easy   Mix  Easy  Hard          1                    1
3 als   Mix  Hard  Easy  Hard          2                    1
4 bld  Hard   Mix  Easy  Easy          1                    1
5 cqr  Hard  Easy  Hard  Hard          3                    2
6 alx  Hard  Hard  Hard  Hard          4                    4
...