Я пытаюсь создать столбец во фрейме данных, содержащий, сколько значений использовалось в средней функции для каждой строки.

Сначала у меня был фрейм данных df вроде этого:

df <- data.frame(tree_id=rep(c("CHC01", "CHC02"),each=8), 
                 rad=(c(rep("A", 4),rep("B", 4), rep("A", 4), 
                 rep("C", 4))), year=rep(2015:2018, 4), 
                 growth= c(NA, NA, 1.2, 3.2, 2.1, 1.5, 2.3, 2.7, NA, NA, NA, 1.7, 3.5, 1.4, 2.3, 2.7))

Затем я создал новый фрейм данных с именем avg_df , содержащий только средние значения роста , сгруппированные по tree_id и год

library(dplyr)

avg_df <- df%>%
  group_by(tree_id, year, add=TRUE)%>%
  summarise(avg_growth=mean(growth, na.rm = TRUE))

Теперь я хотел бы добавить новый столбец в avg_df , содержащий, сколько значений я использовал для расчета среднего роста для каждого tree_id и года , игнорируя NA .

Пример: для CHC01 в 2015 году результат равен 1, потому что это было среднее значение 2,1 и NA и

Для CHC01 в 2018 году будет 2, потому что результат составляет в среднем 3,2 и 2,7

Вот ожидаемый результат:

avg_df$radii <- c(1,1,2,2,1,1,1,2)

tree_id  year avg_growth radii

CHC01    2015       2.1      1
CHC01    2016       1.5      1
CHC01    2017       1.75     2
CHC01    2018       2.95     2
CHC02    2015       3.5      1
CHC02    2016       1.4      1
CHC02    2017       2.3      1
CHC02    2018       2.2      2

* В моих реальных данных значения в радиусах будут варьироваться от 1 до 4.

Может ли кто-нибудь помочь мне с этим?

Большое спасибо!

2
Isabela M 15 Апр 2020 в 23:49

1 ответ

Лучший ответ

Мы можем получить sum элементов, не относящихся к NA (!is.na(growth)) после группировки по 'tree_id' и 'year'

library(dplyr)
df %>%
    group_by(tree_id, year) %>% 
    summarise(avg_growth=mean(growth, na.rm = TRUE), 
              radii = sum(!is.na(growth)))
# A tibble: 8 x 4
# Groups:   tree_id [2]
#  tree_id  year avg_growth radii
#  <fct>   <int>      <dbl> <int>
#1 CHC01    2015       2.1      1
#2 CHC01    2016       1.5      1
#3 CHC01    2017       1.75     2
#4 CHC01    2018       2.95     2
#5 CHC02    2015       3.5      1
#6 CHC02    2016       1.4      1
#7 CHC02    2017       2.3      1
#8 CHC02    2018       2.2      2

Или используя data.table

library(data.table)
setDT(df)[, .(avg_growth = mean(growth, na.rm = TRUE), 
              radii = sum(!is.na(growth))), by = .(tree_id, year)]
1
akrun 15 Апр 2020 в 21:27