Увеличьте счетчик ifelse True и запишите в столбец - PullRequest
1 голос
/ 04 февраля 2020

У меня есть тиббл, где я хочу увеличивать счетчик каждый раз, когда выполняется условие if, и записывать в столбец. На данный момент я могу только изменить строку. Как мне это сделать?

treeTable_w_bucket %>%
 mutate(bucket = ifelse(Feature == "g201a", "test", bucket))
Tree Node Feature Bucket
 0   0    g201a   NA
 1    1   re20s   NA
 2    0   g201a   NA 
 3    0   g201a   NA

Результат

Tree Node Feature Bucket
 0   0    g201a   bucket_1
 1   0    re20s    NA
 2   0    g201s   bucket_2
 3   0    g201s   bucket_3

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Используя cumsum, мы можем подсчитать количество раз Feature = "g201a" и replace значений, которые не являются от "g201a" до NA.

df$Bucket <- with(df, replace(paste0('bucket_', cumsum(Feature == "g201a")), 
                       Feature != "g201a", NA))

#  Tree Node Feature   Bucket
#1    0    0   g201a bucket_1
#2    1    1   re20s     <NA>
#3    2    0   g201a bucket_2
#4    3    0   g201a bucket_3

Это можно сделать и в dplyr трубе

library(dplyr)
df %>%
  mutate(Bucket = replace(paste0('bucket_', cumsum(Feature == "g201a")), 
                          Feature != "g201a", NA))

данные

df <- structure(list(Tree = 0:3, Node = c(0L, 1L, 0L, 0L), Feature = structure(c(1L,
2L, 1L, 1L), .Label = c("g201a", "re20s"), class = "factor")), row.names = c(NA,
-4L), class = "data.frame")
0 голосов
/ 04 февраля 2020

Мы можем использовать replace

library(dplyr)
library(stringr)
treeTable_w_bucket <- treeTable_w_bucket %>% 
        mutate(bucket = replace(Bucket, Feature == 'g201a', 
               str_c('bucket_', seq_len(sum(Feature == 'g201a')))))

Или используя base R

i1 <- treeTable_w_bucket$Feature == 'g201a'
treeTable_w_bucket$bucket[i1] <- paste0("bucket_", cumsum(i1)[i1])
treeTable_w_bucket
#  Tree Node Feature Bucket   bucket
#1    0    0   g201a     NA bucket_1
#2    1    1   re20s     NA     <NA>
#3    2    0   g201a     NA bucket_2
#4    3    0   g201a     NA bucket_3

данные

treeTable_w_bucket <- structure(list(Tree = 0:3, Node = c(0L, 1L, 0L, 0L), Feature = c("g201a", 
"re20s", "g201a", "g201a"), Bucket = c(NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-4L))
...