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 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", "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