Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 循环,用于选择和总结每列,以便以后排列_R_Loops_Permutation - Fatal编程技术网

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