当前位置: 首页 > 知识库问答 >
问题:

R函数从数据帧中提取前n个分数,并使用“`apply`或dplyr``行方式查找其平均值```

施敏达
2023-03-14

数据框是这样的

df = data.frame(name = c("A","B","C"),
               exam1 = c(2,6,4),
               exam2 = c(3,5,6),
               exam3 = c(5,3,3),
               exam4 = c(1,NA,5))

我想提取每个“名称”的前三名考试分数,并使用apply()或dplyr rowwise()函数找到它们的平均值。

共有3个答案

封飞
2023-03-14

使用purrr::pmap_dfr

library(tidyverse)

df = data.frame(name = c("A","B","C"),
                exam1 = c(2,6,4),
                exam2 = c(3,5,6),
                exam3 = c(5,3,3),
                exam4 = c(1,NA,5))

df %>% 
  pmap_dfr(~ list(means = mean(sort(c(..2,..3,..4,..5), decreasing=T)[1:3]))) %>%
  bind_cols(df,.)

#>   name exam1 exam2 exam3 exam4    means
#> 1    A     2     3     5     1 3.333333
#> 2    B     6     5     3    NA 4.666667
#> 3    C     4     6     3     5 5.000000

另一种可能的解决方案,基于tidyr::pivot\u longer且不使用行方式

library(tidyverse)

df = data.frame(name = c("A","B","C"),
                exam1 = c(2,6,4),
                exam2 = c(3,5,6),
                exam3 = c(5,3,3),
                exam4 = c(1,NA,5))

df %>% 
  pivot_longer(cols = 2:5, names_to = "names") %>% 
  group_by(name) %>% 
  slice_max(value, n=3) %>% 
  summarise(mean = mean(value)) %>% 
  inner_join(df)

#> Joining, by = "name"
#> # A tibble: 3 × 6
#>   name   mean exam1 exam2 exam3 exam4
#>   <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 A      3.33     2     3     5     1
#> 2 B      4.67     6     5     3    NA
#> 3 C      5        4     6     3     5
花欣然
2023-03-14

这里有一种旋转和使用top\n的替代方法:这将只返回前3位:

library(dplyr)
library(tidyr)
df %>% 
  pivot_longer(
    -name,
    names_to = "exam",
    values_to = "value"
  ) %>% 
  group_by(name) %>% 
  top_n(3, value) %>% 
  mutate(mean = mean(value)) %>% 
  pivot_wider(
    names_from = exam, 
    values_from = value
  )
  name   mean exam1 exam2 exam3 exam4
  <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A      3.33     2     3     5    NA
2 B      4.67     6     5     3    NA
3 C      5        4     6    NA     5

或:

library(tidyr)
df %>% 
  pivot_longer(
    -name,
    names_to = "exam",
    values_to = "value"
  ) %>% 
  group_by(name) %>% 
  top_n(3, value) %>% 
  summarise(mean = mean(value))
 name   mean
  <chr> <dbl>
1 A      3.33
2 B      4.67
3 C      5   
陈奇希
2023-03-14

使用apply,使用MARGIN=1,循环数值列上的行,sort,根据递减=真/假获取头/尾,并在基R返回平均值

apply(df[-1], 1, FUN = function(x) mean(head(sort(x, decreasing = TRUE), 3)))
[1] 3.333333 4.666667 5.000000

或使用dplyr/rowwise

library(dplyr)
df %>%
  rowwise %>%
  mutate(Mean = mean(head(sort(c_across(where(is.numeric)), 
       decreasing = TRUE), 3))) %>% 
  ungroup
# A tibble: 3 × 6
  name  exam1 exam2 exam3 exam4  Mean
  <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A         2     3     5     1  3.33
2 B         6     5     3    NA  4.67
3 C         4     6     3     5  5   
 类似资料:
  • 我正在尝试使用用户输入将数字放入一个数组,然后找到这些数字的平均值,也找到哪些数字大于平均值。这些数字进入一个数组,但当我试图求平均数时,我无法求出平均数,以及哪些数字大于平均数,因为对于试图求出大于平均数的数字的部分,并非所有变量都是可见的。但是,当我允许这个部分看到所有的变量(don't But{}围绕某些部分)时,它会找到每一个数的平均值。现在,它为每个数字打印平均值,而为大于平均值的数字打

  • 第一次问问题(温柔点),因为我还没有找到任何有用的东西。 在R中,我有两个数据帧。一个(DataFrameA)有一列带有唯一日期列表。另一个(DataFrameB)也有日期列表。但是DataFrameB中的某些日期在DataFrameA中可能不存在。在这种情况下,我想将DataFrameB中的日期更新为DataFrameA中的最小日期,该日期大于DataFrameB中的日期。 在SQL中,我可能会

  • 本文向大家介绍PHP程序查找偶数的前n个自然数的平均值,包括了PHP程序查找偶数的前n个自然数的平均值的使用技巧和注意事项,需要的朋友参考一下 要找到偶数前n个自然数的平均值,代码如下- 示例 输出结果 定义了一个名为“ even_nums_avg”的函数,该函数将所有数字加起来达到给定的限制,然后将其除以值的总数。这是前几个自然数的平均值。定义了一个值,并通过传递该值来调用函数,该值实际上是需要

  • 如果我想从不同的组中随机选择一些样本,我使用plyr包和下面的代码 这里从每个物种中选取10个样本。 我的一些数据帧非常大,我的问题是我可以对dplyr包使用相同的srovGroup函数吗?或者有另一种方法可以在dplyr中做同样的事情? 编辑 dplyr 包的 0.2 版引入了两个新功能,用于从表中选择随机行sample_n和sample_frac

  • Python是否有一个SciPy函数或NumPy函数或模块来计算给定特定窗口的一维数组的运行平均值?

  • 我有一个如下所示的数据帧: 我需要提取lat=30.75和lon 76.25的行,对于我使用的行: 但这表明了这个错误: