【问题标题】:Dynamically Select Columns and Summaries Data [duplicate]动态选择列和汇总数据[重复]
【发布时间】:2020-01-16 10:23:19
【问题描述】:

我有以下数据框

ID <- c(1,1,2,3,4,5,6)
Value1 <- c(20,50,30,10,15,10,NA)
Value2 <- c(40,33,84,NA,20,1,NA)
Value3 <- c(60,40,60,10,25,NA,NA)
Grade1 <- c(20,50,30,10,15,10,NA)
Grade2 <- c(40,33,84,NA,20,1,NA)

DF <- data.frame(ID,Value1,Value2,Value3,Grade1,Grade2)

  ID Value1 Value2 Value3 Grade1 Grade2
1  1     20     40     60     20     40
2  1     50     33     40     50     33
3  2     30     84     60     30     84
4  3     10     NA     10     10     NA
5  4     15     20     25     15     20
6  5     10      1     NA     10      1
7  6     NA     NA     NA     NA     NA

我想按 ID 分组,选择名称包含字符串(“值”)的列,并获取不包括 NA 的这些列的平均值。

这是所需输出的示例

ID     mean(Value)
1      41
2      58
3      10
....

为了解决这个挑战,我编写了以下代码

Library(tidyverse)    
DF %>% group_by (ID) %>% select(contains("Value")) %>% summarise(mean(.,na.rm = TRUE))

代码按 ID 对数据进行分组,选择列名包含 ("Value") 的列,并尝试使用均值函数汇总所选列。当我运行我的代码时,我得到以下输出

> DF %>% group_by (ID) %>% select(contains("Value")) %>% summarise(mean(.))
Adding missing grouping variables: `ID`
# A tibble: 6 x 2
     ID `mean(.)`
  <dbl>     <dbl>
1     1        NA
2     2        NA
3     3        NA
4     4        NA
5     5        NA
6     6        NA

感谢您以这种方式提供帮助。

【问题讨论】:

    标签: r dataframe dplyr tidyverse


    【解决方案1】:

    您应该尝试使用 pivot_longer 来获取从宽格式到长格式的数据 在 pivot_longerpivot_wider (https://tidyr.tidyverse.org/articles/pivot.html) 上阅读最新的 tidyR 更新

    library(tidyverse)
    
    ID <- c(1,2,3,4,5,6)
    Value1 <- c(50,30,10,15,10,NA)
    Value2 <- c(33,84,NA,20,1,NA)
    Value3 <- c(40,60,10,25,NA,NA)
    
    DF <- data.frame(ID,Value1,Value2,Value3)
    
    DF %>% pivot_longer(-ID) %>% 
      group_by(ID) %>% summarise(mean=mean(value,na.rm=TRUE))
    

    在这里输出

       ID  mean
      <dbl> <dbl>
    1     1  41  
    2     2  58  
    3     3  10  
    4     4  20  
    5     5  5.5
    6     6 NaN  
    

    【讨论】:

    • 能否解释一下为什么要使用数据透视函数?是否可以通过分组来解决这个问题?
    • 我使用了分组,但在透视之后,因为您的数据是宽格式的。为了对数据进行分组,我们需要长格式(阅读此内容以了解 Wide Vs Long 数据discuss.analyticsvidhya.com/t/…
    【解决方案2】:

    不使用 dplyr 或任何特定包,这会有所帮助:

    DF$mean<- rowMeans(DF[,c(2:4)], na.rm = T)
    

    【讨论】:

    • 您的解决方案假定列的索引是静态的。我想通过使用列名进行搜索来避免这个问题。
    • 如果 ID 始终存在,您可以使用:DF$avg % select(-ID), na.rm = T)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2021-12-29
    • 2020-08-31
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多