R 循环,用于选择和总结每列,以便以后排列
我有一个类似于下面的数据集。我的想法是我需要使用一个循环来做均值差异的排列测试。我的主要问题是我必须循环数据集中的列,我不知道如何循环R 循环,用于选择和总结每列,以便以后排列,r,loops,permutation,R,Loops,Permutation,我有一个类似于下面的数据集。我的想法是我需要使用一个循环来做均值差异的排列测试。我的主要问题是我必须循环数据集中的列,我不知道如何循环 df = data.frame(matrix(rnorm(10), nrow=5)) category <- rep(c("good", "bad"), c(2, 3)) id <- c(1, 2, 3, 4, 5) df <- cbind(id, df, category) id X1 X2 categ
df = data.frame(matrix(rnorm(10), nrow=5))
category <- rep(c("good", "bad"), c(2, 3))
id <- c(1, 2, 3, 4, 5)
df <- cbind(id, df, category)
id X1 X2 category
1 1 0.5584823 -2.3135133 good
2 2 -0.1115585 0.4731869 good
3 3 -0.7435472 -0.0231894 bad
4 4 -0.6673812 0.7470000 bad
5 5 -1.2959973 0.4255970 bad
对于X1和X2(以及此处未显示的98个其他X变量)
因此,对于从1到100的每个X,我必须得到组中X的平均值=好,组中X的平均值=坏,这样我可以运行一个循环来排列所有X的组之间X值的平均差
我不知道如何运行循环来选择列并将其映射到类别,然后返回该子集的平均值。我假设为了进行排列,我需要一个“好”和“坏”的向量来比较。所以我想这一定是第一个循环的结果?如果我们想循环,那么使用
map2
。根据OP的代码,我们正在筛选中的'bad'、'good'和选择中的'X1'、'X2'列。因此,在map2
中,将它们作为两个向量
传递,过滤器
,选择
数据集,并用新名称汇总选择
列的平均值
library(tidyverse)
map2(c("bad", "good"), c("X1", "X2"), ~
df %>%
filter(category == .x) %>%
select(.y) %>%
summarise(!! paste0("mean_X_", .x) := mean(!! rlang::sym(.y))))
#[[1]]
# mean_X_bad
#1 -0.4954794
#[[2]]
# mean_X_good
#1 0.7497338
可以对其进行分组
ed,然后在
df %>%
group_by(category) %>%
summarise_at(vars(matches("^X\\d+$")), mean)
# A tibble: 2 x 3
# category X1 X2
# <fct> <dbl> <dbl>
#1 bad 0.228 -0.438
#2 good -0.00465 0.355
数据
set.seed(24)
df=数据帧(矩阵(rnorm(10),nrow=5))
类别首先使用tidyr::Gather
收集数据(使其为“长”而不是“宽”),然后通过分组类别和变量进行总结:
library(tidyverse)
df %>%
gather(key = "variable", value = "value", -id, -category) %>%
group_by(category, variable) %>%
summarise(mean = mean(value))
以下是输出:
# A tibble: 4 x 3
# Groups: category [2]
category variable mean
<fct> <chr> <dbl>
1 bad X1 -0.323
2 bad X2 0.342
3 good X1 0.0793
4 good X2 0.632
#一个tible:4 x 3
#组别:组别[2]
类别变量均值
1坏X1-0.323
2坏X2 0.342
3良好X1 0.0793
4良好X2 0.632
这很酷,但似乎只适用于示例。我的数据集有两个类别,但有100个X值,X_1到X_100。map2函数似乎要求.x和.y长度相等?@Michael你能用summary_at
检查第二段代码吗?另外,为了我的启发,你能解释感叹号到底在做什么,以及它的含义是什么:=?@Michael这是一个用于创建列的赋值运算符。如果您使用了data.table
,则通过引用创建列时也会使用相同的方法。但是,在tidyverse上下文中,它的行为是不同的,尽管它创建了一个列并将lhs上的表达式作为新列的字符串进行计算name@Michael你也可以检查更多的了解这显然是我需要的。似乎我有更多的实践来处理聚集函数。真不敢相信事情竟那么简单。我觉得很傻。谢谢大家!@迈克尔:没问题,希望对你的整个数据集都有帮助。阅读(和做)r4ds的这一部分有助于我理解这些功能:
set.seed(24)
df = data.frame(matrix(rnorm(10), nrow=5))
category <- rep(c("good", "bad"), c(2, 3))
id <- c(1, 2, 3, 4, 5)
df <- cbind(id, df, category)
library(tidyverse)
df %>%
gather(key = "variable", value = "value", -id, -category) %>%
group_by(category, variable) %>%
summarise(mean = mean(value))
# A tibble: 4 x 3
# Groups: category [2]
category variable mean
<fct> <chr> <dbl>
1 bad X1 -0.323
2 bad X2 0.342
3 good X1 0.0793
4 good X2 0.632