【问题标题】:Loop mutating multiple columns in R循环变异R中的多列
【发布时间】:2021-02-02 14:22:25
【问题描述】:

我对使用 R 比较陌生,我需要一些帮助来创建一个循环来改变多个列。我正在尝试使用宽格式数据框创建一个对每个样本进行计算的列。我的数据框看起来与此类似:

df<- data.frame("count1" = c(1,2,3,4), "total1" = c(5,6,8,9), "count2" = c(4,3,2,1), "total2" = c(9,8,6,5))

count1 和 total 1 属于同一个样本,我想使用公式为每个样本改变一列

df <- df %>% mutate(percent1 = count1/total1)

我正在尝试创建一个循环来自动改变这些列,因为我有一百多个样本/列。我不确定我是否必须先融化数据框,但由于数据比上面描述的更复杂,这是不希望的。我尝试了多种方法来创建循环,例如

for (i in 1:nrow(samples)){
df <- df %>% mutate(paste("percent", i) = df$(paste("count"), i) / df$(paste"total", i)
}

但由于它不起作用,我非常感谢任何帮助

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    如果不使用dplyr,这可能会更容易,因为:

    for (i in 1:nrow(samples)){
      df[[paste0("percent", i)]] <- df[[paste0("count", i)]] / df[[paste0("total", i)]]
    }
    

    【讨论】:

      【解决方案2】:

      或者没有循环:

      n <- nrow(samples)
      df[paste0('percent', 1:n)] <- 
        df[grep('count', names(df))] / df[grep('total', names(df))]
      
      #   count1 total1 count2 total2  percent1  percent2
      # 1      1      5      4      9 0.2000000 0.4444444
      # 2      2      6      3      8 0.3333333 0.3750000
      # 3      3      8      2      6 0.3750000 0.3333333
      # 4      4      9      1      5 0.4444444 0.2000000
      

      【讨论】:

        【解决方案3】:

        只要你的变量是有序的,你可以使用purrr::map2

        library(tidyverse)
        df[paste0("percent", 1:2)] <- map2(df %>% select(starts_with("count")), 
                                            df %>% select(starts_with("total")),  ~ .x/.y)
        df
        #   count1 total1 count2 total2  percent1  percent2
        # 1      1      5      4      9 0.2000000 0.4444444
        # 2      2      6      3      8 0.3333333 0.3750000
        # 3      3      8      2      6 0.3750000 0.3333333
        # 4      4      9      1      5 0.4444444 0.2000000
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多