функции и свернуть, чтобы найти любое окно всех значений, равных чему-то? - PullRequest
1 голос
/ 14 января 2020

Выполните следующие действия: Есть ли способ в R сделать ifelse для определенных последовательных строк?

Данные:

df<-data.frame(group=c(1, 1,1, 1,1, 2, 2, 2, 4,4,4,4), 
               value=c("A","B","C","B","A","A","A","B","D","A","A","B"),
               want_every_c=c("yes","yes","yes","yes","yes","no","no","no","no","no","no","no"),
               want_every_b=c("yes","yes","yes","yes","yes","yes","yes","yes","no","no","no","no"),
               want_two_a_within_together=c("no","no","no","no","no", "yes","yes","yes", "yes","yes","yes", "yes" ))

Решения работали отлично чтобы получить столбцы "want_every_" при сканировании трех.

предыдущее решение:

f2 <- function(colNm, val){
        c('no', 'yes')[(all(rollapply({{colNm}}, 3, 
             FUN = function(x) val %in% x))) + 1]
 }

df %>%
    group_by(group) %>%
    mutate(want_every_c = f2(value, "C"),
           want_every_b = f2(value, "B"))

Я новичок в функциях и хотел бы использовать его по-другому. Я хочу новый столбец с именем "want_two_a_within_together", где в группе любое сканирование двух имеет полностью значение = 'A'. Примерно так:

    group value want_two_a_within_together
1      1     A                         no
2      1     B                         no
3      1     C                         no
4      1     B                         no
5      1     A                         no
6      2     A                        yes
7      2     A                        yes
8      2     B                        yes
9      4     D                        yes
10     4     A                        yes
11     4     A                        yes
12     4     B                        yes

Я думаю, что мог бы добавить куда угодно в функцию и изменить ширину на 2, но не совсем уверен.

текущая попытка и проблема при создании окна 3:


f2 <- function(colNm, val, w){ c('no', 'yes')[(all(rowSums(rollapply({{colNm}}, w, FUN = function(x) x %in% val)) > 0))+1]}

df<-data.frame(value=c("B","B","B","B","B","A","A","A","A","A","A"),
              correct=c("yes","yes","yes", "yes","yes","yes", "yes" ,"yes","yes","yes","yes"))

df%>%  mutate(try = if(n()>2) f2(value, "A", 3) else "no")



   value want_three_a_within_together try
1      B                          yes  no
2      B                          yes  no
3      B                          yes  no
4      B                          yes  no
5      B                          yes  no
6      A                          yes  no
7      A                          yes  no
8      A                          yes  no
9      A                          yes  no
10     A                          yes  no
11     A                          yes  no

1 Ответ

2 голосов
/ 14 января 2020

Функция может быть изменена для расчета rowSums

f2n <- function(colNm, val, w){ 
    c('no', 'yes')[(any(rowSums(rollapply({{colNm}}, w, 
    FUN = function(x) x %in% val)) == w))+1]
  }

library(dplyr)
library(zoo)
df%>% 
    group_by(group) %>%
     mutate(new_want_two_a_within_together = if(n()>1) f2n(value, "A", 2) else "no")
# A tibble: 18 x 4
# Groups:   group [4]
#   group value want_two_a_within_together new_want_two_a_within_together
#   <dbl> <fct> <fct>                      <chr>                         
# 1     1 A     no                         no                            
# 2     1 B     no                         no                            
# 3     1 C     no                         no                            
# 4     1 B     no                         no                            
# 5     1 A     no                         no                            
# 6     2 A     yes                        yes                           
# 7     2 A     yes                        yes                           
# 8     2 B     yes                        yes                           
# 9     4 D     yes                        yes                           
#10     4 A     yes                        yes                           
#11     4 A     yes                        yes                           
#12     4 B     yes                        yes                           
#13     5 A     yes                        yes                           
#14     5 B     yes                        yes                           
#15     5 B     yes                        yes                           
#16     5 A     yes                        yes                           
#17     5 A     yes                        yes                           
#18     5 A     yes                        yes         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...