2016-07-09 2 views
1

У меня есть некоторые значения, которые обозначаются как часть групп.Проблема с использованием dplyr для изменения значений указанных групп

В некоторых группах распространение значений слишком велико.

Я хочу настроить нижние значения этих групп.

я могу генерировать некоторые синтетические данные, как так:

groups <- floor(runif(1000,1,100)) 
values <- rnorm(1000,0,1) 
df  <- data.frame(group=groups,val=values) 

Давайте найти группы, представляющие интерес:

groups_to_adjust <- df %>% group_by(group) %>% summarise(diff=max(val)-min(val)) %>% filter(diff>4) %>% select(group) 

Я думаю я могу настроить их так:

df <- df %>% rowwise() %>% mutate(val=ifelse(group %in% groups_to_adjust, ifelse(val<0,val+4,val), val)) 

Но НЕТ! это не работает?

Использование

df %>% rowwise() %>% filter(group %in% groups_to_adjust) 

указывает на то, что оператор %in% является, по сути, не выбирая ни одной строки на всех.

Как выполнить эту операцию?

ответ

1

Нам нужно извлечь «группу» из набора данных «groups_to_adjust».

r1 <- df %>% 
     filter(group %in% groups_to_adjust$group) 

, как это 'data.frame' с двумя колонками

str(groups_to_adjust) 
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  16 obs. of 2 variables: 
# $ group: num 12 13 23 35 40 42 46 53 54 56 ... 
# $ diff : num 4.09 4.66 4.52 4.3 4.33 ... 

Мы можем сделать это в компактном виде с filter

df1 <- copy(df) 
r2 <- df %>% 
     group_by(group) %>% 
     filter((max(val)- min(val)) > 4) 
all.equal(r1, r2, check.attributes=FALSE) 
#[1] TRUE 
+1

Dang! Слишком легко. Спасибо :-) – Richard

+0

Есть ли способ упростить этот вид операции? – Richard

+0

@Richard Вы можете использовать 'filter' (обновленный пост) – akrun

Смежные вопросы