【问题标题】:R: How to select subsets of a column and repeat this over several columnsR:如何选择列的子集并在多列上重复此操作
【发布时间】:2021-04-13 20:46:04
【问题描述】:

我有一个包含 100 行和 13 列的数据框。数据框包含 11 个级别的观察结果(控制、组 1、组 2、...)

treatment variable1 variable 2
control 1 3
control 2 4
control 0.5 2
group1 1.2 1.2
group1 3 6
  1. 我必须创建我的组的效果大小。为此,我需要将我的数据子集到变量 1 的各个处理中。接下来,我必须在公式中使用子集:
cohen.d(var1$group1, var1$control, na.rm = TRUE, hedges = T) %>% .$estimate
  1. 必须重复此步骤才能将 10 种不同的治疗方法与我的对照组进行比较。
  2. 必须对每一列(变量)重复这些步骤
  3. 我想将 cohen.d 公式的输出存储在 tibble 中

如何在不需要太多代码的情况下完成这些步骤?我试过这样...

hedge_calc <- function(y){
  
  df <- data_single_response %>% select(c(y,), treatment)
  
  x <- list()
  for (i in 1:length(factor.list)){
    x[i] <- df %>% filter(., remark == factor.list[i])
  }
  
  h <- list()
  for (i in 1:length(factor.list)){
    h[i] <- cohen.d(as.numeric(as.character(unlist(x[[i]]))), as.numeric(as.character(unlist(x[[1]]))) 
                    , na.rm = TRUE, hedges = T) %>% .$estimate
  }
  c <- list()
  for (i in 1:length(factor.list)){
    c[i] <- cohen.d(as.numeric(as.character(unlist(x[[i]]))), as.numeric(as.character(unlist(x[[1]]))) 
                    , na.rm = TRUE, hedges = T) %>% .$conf.int%>% .[1]
  }
  
  d <- list()
  for (i in 1:length(factor.list)){
    d[i] <- cohen.d(as.numeric(as.character(unlist(x[[i]]))), as.numeric(as.character(unlist(x[[1]]))) 
                    , na.rm = TRUE, hedges = T) %>% .$conf.int %>% .[2]
  }


  
  result <- data.frame(hedges_g = unlist(h), lower = unlist(c),
                       upper = unlist(d), treat_vs_control = factor.list[1:11])
  
  print(result)
}

hedge_calc(3)

...并通过从第 2:13 列循环接收我的结果。 但是因为这阅读起来非常混乱且容易出错,所以我需要使用更好的代码。

你有什么想法吗?

非常感谢大家:)

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    df如下

    > df
      treatment variable1 variable2
    1   control       1.0       3.0
    2   control       2.0       4.0
    3   control       0.5       2.0
    4    group1       1.2       1.2
    5    group1       3.0       6.0
    6    group2       4.0       6.0
    7    group2       5.0       7.0
    

    然后你首先根据不同的处理级别拆分data.frame,然后执行两个lapply()语句来迭代变量和组。

    cohen_list <- lapply(2:ncol(df), 
                          function(y) lapply(2:length(df_list), 
                                        function(x) cohen.d(df_list[[1]][, y],  
                                                            df_list[[x]][, y], 
                                                            na.rm = TRUE, hedges= TRUE)$estimate))
    

    然后将列表绑定在一起,将其转换为有用的格式并将其转换为数据帧。

    final_df <- cohen_list %>% 
                do.call("rbind", .) %>% 
                t %>% 
                as.data.frame
    

    最后,调整行名和列名

    rownames(final_df) <- setdiff(unique(df$treatment), "control")
    colnames(final_df) <- colnames(df[,2:ncol(df)])
    

    带有最终输出

    > final_df
            variable1  variable2
    group1 -0.7042911 -0.2055516
    group2  -3.252463  -2.788406
    

    【讨论】:

      猜你喜欢
      • 2015-03-21
      • 1970-01-01
      • 2021-04-28
      • 2021-07-23
      • 1970-01-01
      • 2019-03-16
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多