Выполните следующие действия: Есть ли способ в 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