动态选择列和汇总数据[重复]
Posted
技术标签:
【中文标题】动态选择列和汇总数据[重复]【英文标题】: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
感谢您以这种方式提供帮助。
【问题讨论】:
【参考方案1】:您应该尝试使用 pivot_longer
来获取从宽格式到长格式的数据 在 pivot_longer
和 pivot_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)以上是关于动态选择列和汇总数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章