#r
#r
Вопрос:
Я застрял с простым вопросом. Как объединить и усреднить числа в пределах допустимого значения (diff = -0.002) в столбце ia и суммировать значения в столбце times.
например
ia<-c(1.001,1.002,2,2.2,1.1,1,1,1,2.5,1,2.8)
time<-c(4.5,2.4,1.5,1.2,4.9,6.4,4.4, 4.7, 7.3,2.3, 4.3)
a<-as.data.frame(cbind(ia, time))
ia time
1 1.001 4.5
2 1.002 2.4
3 2.000 1.5
4 2.200 1.2
5 1.100 4.9
6 1.000 6.4
7 1.000 4.4
8 1.000 4.7
9 2.002 7.3
10 1.000 2.3
11 2.800 4.3
to
ia time
1 1.001 24.7 # ia = mean(1 2 6 7 8 10) time = sum(1 2 6 7 8 10)
3 2.001 9.7 # ia = mean(2 9) time = sum(2 9)
4 2.200 1.2
5 1.100 4.9
11 2.800 4.3
Спасибо!
Комментарии:
1. Цель немного неоднозначна. Что, если ваш
ia
столбец имеет значение1.001, 1.003, 1.005
, будут ли они суммированы как одна группа или (1.001, 1.003
) и (1.003, 1.005
) ?2. Привет, люминчжао. Да, для ia они будут суммированы как одна и та же группа, если строки имеют приблизительные значения
3. @hees Я не понимаю вашего ответа на важный и правильный вопрос люминьчжао. Как суммируются значения в примере: как
(1.001, 1.003)
или как(1.003, 1.005)
? Каковы правила для устранения этих неоднозначностей?4.@hees «если ваш столбец ia имеет значение 1.001, 1.003, 1.005, они будут суммированы как 1.003» Да? Почему? Это не согласуется с вашей первоначальной постановкой задачи, где вы спрашиваете, как «комбинировать и обозначать числа в пределах заданного допуска (diff = 0.002)»
1.005 - 1.001 = 0.004
, что больше вашего допуска.5. @ liuminzhao, @Maurits Evers, хорошо, я понял вашу идею. Это интересно. я думаю, что они будут сведены в одну группу. допуск = — 0.002
Ответ №1:
Мне вообще непонятно, что вы пытаетесь сделать, и примеры / объяснения, которые вы привели в комментариях, заставляют меня еще больше ломать голову.
Помимо этого, возможно, следующее является достойной отправной точкой для дальнейших уточнений.
Мы можем использовать cut
для группировки значений, ia
а затем суммировать ia
и time
значения по grp
diff = 0.002
library(dplyr)
a %>%
mutate(grp = cut(ia, seq(min(ia), max(ia), by = diff), include.lowest = T)) %>%
group_by(grp) %>%
summarise(
io = mean(ia),
time = sum(time))
## A tibble: 6 x 3
# grp io time
# <fct> <dbl> <dbl>
#1 [1,1.002] 1.00 24.7
#2 (1.098,1.1] 1.1 4.9
#3 (1.998,2] 2 1.5
#4 (2.198,2.2] 2.2 1.2
#5 (2.498,2.5] 2.5 7.3
#6 (2.798,2.8] 2.8 4.3
Комментарии:
1. хорошо, я понял вашу идею. Это интересно. я думаю, что они будут сведены в одну группу. допуск = — 0.002
Ответ №2:
Одним из решений является создание фиктивной переменной группировки. К сожалению, из вашего вопроса трудно определить, какую группировку вы ищете. Хотя, основываясь на вашем выводе toy, я предполагаю, что вы хотите {(0, 1.1) [1.1, 2.01) [2.01, 2.2) [2.2, 2.8) [2.8, Inf)}? Если это так, вы могли бы использовать:
a$group <- ifelse(a$ia < 1.1, 0,
ifelse(a$ia >= 1.1 amp; a$ia < 2.01, 1,
ifelse(a$ia >= 2.01 amp; a$ia < 2.2, 2,
ifelse(a$ia >= 2.2 amp; a$ia < 2.8, 3, 4))))
Тогда вы сможете проще использовать функции tidyverse
a %>% group_by(group) %>% summarize("ia" = mean(ia), "time" = sum(time))