R 创建动态分组依据

R 创建动态分组依据,r,dataframe,dplyr,tidyverse,purrr,R,Dataframe,Dplyr,Tidyverse,Purrr,我想创建一个循环,循环遍历df数据帧,并将结果保存到列表或数据帧中,而不是为每个唯一的groupby集合编写新的代码 我想看看featureA的平均值是如何在RSS featuresB和C中传播的,而不必为数据集中的每个分类特征编写新的代码 我试过这个: df = data.frame( A = c(1, 4, 5, 13, 2), B = c("Group 1", "Group 3", "Group 2", "Group 1", "Group 2"), C = c("Group 3

我想创建一个循环,循环遍历
df
数据帧,并将结果保存到列表或数据帧中,而不是为每个唯一的
groupby
集合编写新的代码

我想看看featureA的平均值是如何在RSS featuresBC中传播的,而不必为数据集中的每个分类特征编写新的代码

我试过这个:

df = data.frame(
  A = c(1, 4, 5, 13, 2),
  B = c("Group 1", "Group 3", "Group 2", "Group 1", "Group 2"),
  C = c("Group 3", "Group 2", "Group 1", "Group 2", "Group 3")
)

df %>%
  group_by(B) %>%
  summarise(val = mean(A))

df %>%
  group_by(C) %>%
  summarise(val = mean(A))
列出\u组的\u%
分组依据(!!!syms(名称(df)[1:i]))%>%
汇总(新值=平均值(A))
})

您可以尝试以下方法:

List_Of_Groups <- map_df(df, function(i) {
  df %>% 
    group_by(!!!syms(names(df)[1:i])) %>% 
    summarize(newValue = mean(A))
})
库(dplyr)
空列表%摘要(val=平均值(A))
}
空列表
[[1]]
#一个tibble:3x2
`df[,i]`val
1组17
2组2 3.5
3组3 4
[[2]]
#一个tibble:3x2
`df[,i]`val
1组1 5
2组2 8.5
3组3 1.5

希望这能有所帮助。

使用
purr
map
,您可以将指定的代码块应用于所有字符列。基本上,将字符变量的名称映射到后面的函数

library(dplyr)
empty_list <- list(0)
for(i in 2:dim(df)[2])
{
  empty_list[[i-1]]<-df %>% group_by(df[,i]) %>% summarise(val = mean(A))
}
empty_list

[[1]]
# A tibble: 3 x 2
  `df[, i]`   val
  <fct>           <dbl>
1 Group 1           7  
2 Group 2           3.5
3 Group 3           4  

[[2]]
# A tibble: 3 x 2
  `df[, i]`   val
  <fct>           <dbl>
1 Group 1           5  
2 Group 2           8.5
3 Group 3           1.5
输出

purrr::map(names(df %>% select(where(is.character))), function(i) {
  df %>% 
    group_by(!!sym(i)) %>% 
    summarize(newValue = mean(A))
})
#[[1]]
#一个tibble:3x2
#B新价值
#         
#1组17
#2组2 3.5
#3组3 4
# 
# [[2]]
#一个tibble:3x2
#C新价值
#         
#1组1 5
#2组2 8.5
#3组3 1.5

您可以使用A作为标识符长时间旋转它,然后按以下方式分组:

# [[1]]
# A tibble: 3 x 2
#   B       newValue
#   <chr>      <dbl>
# 1 Group 1      7  
# 2 Group 2      3.5
# 3 Group 3      4  
# 
# [[2]]
# A tibble: 3 x 2
#   C       newValue
#   <chr>      <dbl>
# 1 Group 1      5  
# 2 Group 2      8.5
# 3 Group 3      1.5
library(tidyr)
df%%>%pivot_更长(-A)%%>%group_by(名称、值)%%>%Summary(val=mean(A))
#一个tibble:6x3
#分组:名称[2]
名称值val
1b组17
2 B组2 3.5
3 B组3 4
4 C组1 5
5 C组2 8.5
6 C组3 1.5

请原谅这个双关语,但是
从哪里来?package?
其中
是一个
tidyselect
函数,自
dplyr
1.0版起,该函数可在一些
dplyr
语句中使用。你可以看看@Loncar的一些例子,最好是更新它们:)否则你可以使用
名称(df%>%select_if(is.character))
,结果将是相同的变量字符或因子?如果你写
c(“B”,“c”)
而不是
names(…)
,你试过它是否有效吗?这很奇怪,因为
names()
应该返回列名的字符向量。。如果运行
names(df%>%select(where(is.character)))
names(df%>%select_if(is.character))
,输出是什么?
library(tidyr)
df %>% pivot_longer(-A) %>% group_by(name,value) %>% summarize(val=mean(A))
# A tibble: 6 x 3
# Groups:   name [2]
  name  value     val
  <chr> <fct>   <dbl>
1 B     Group 1   7  
2 B     Group 2   3.5
3 B     Group 3   4  
4 C     Group 1   5  
5 C     Group 2   8.5
6 C     Group 3   1.5