寻找一个函数来有条件地对前 n 个值(不是行!)的平均值进行微调,并返回数字而不是数据帧

Looking for a function to fined the mean of the top n values (not rows!) conditionally and return the number and not a dataframe

提问人:Maya Eldar 提问时间:4/22/2022 最后编辑:user438383Maya Eldar 更新时间:4/22/2022 访问量:26

问:

我有一个大数据框: percentage_activity

# A tibble: 4,437 x 3
# Groups:   DATETIME [87]
   DATETIME            ID        COUNT
   <dttm>              <chr>     <int>
 1 2020-06-07 00:00:00 Bagheera     NA
 2 2020-06-07 00:00:00 Bagheera2     0
 3 2020-06-07 00:00:00 Baloo img     0
 4 2020-06-07 00:00:00 Banna        NA
 5 2020-06-07 00:00:00 Blair       158
 6 2020-06-07 00:00:00 Carol        NA

其中,我想计算特定 ID 的前 5 个 COUNT 的平均值,然后在 for 循环中,将每个 COUNT 值表示为一个数量,为该 ID 计算的平均值为该特定 ID 的 100%。 为此,我真的宁愿得到一个平均值,而不是作为所有个人的数据,而是作为所需 ID 的单个数字,然后将其用作 for 循环中的变量。

我实际上正在尝试重建一个循环,该循环适用于每个 ID 的单独列组织的相同数据,但是在将数据融化为一个 ID 列后,它需要判定:

max_activity <- readline(prompt="enter a number: ")
    for(i in 2:length(percentage_activity)) {
    percentage_activity[[i]] <- 
     as.numeric(percentage_activity[[i]]*100/mean(sort(percentage_activity[[i]] ,T) 
    [1:max_activity]))
}

我也试过了这个,但我不确定如何从这里开始:

for (i in unique(percentage_activity$ID)){
  individual <- percentage_activity$ID == i
  mean(percentage_activity[individual,"COUNT"], na.rm=TRUE)
}
r 平均 top-n

评论


答:

0赞 Julian 4/22/2022 #1

也许这可能会有所帮助:

library(dplyr)
df <- tibble(
  DATETIME = as.Date(c("2020-06-07",
                       "2020-06-07",
                       "2020-06-07",
                      "2020-06-07",
                       "2020-06-07",
                       "2020-06-07",
                      "2020-06-07",
                      "2020-06-07",
                      "2020-06-07",
                      "2020-06-07",
                      "2020-06-07",
                      "2020-06-07")),
  ID = c("Bagheera", "Bagheera2", "Baloo img", "Banna", "Blair", "Carol", 
         "Bagheera", "Bagheera2", "Baloo img", "Banna", "Blair", "Carol"),
  COUNT = c(NA, 0,0,NA, 158, NA,10,20,30,40,50, 60)
)

mean_val <- df %>% 
  group_by(ID) %>% 
  arrange(desc(COUNT)) %>% 
  top_n(5) %>% 
  summarise(mean = mean(COUNT, na.rm = T)) 

df %>% 
  left_join(mean_val, by = "ID") %>% 
  mutate(percentage_activity =  COUNT/mean)