繁体   English   中英

循环变异 R 中的多列

[英]Loop mutating multiple columns in R

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

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)

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

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

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

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

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

或者没有循环:

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

只要您的变量是有序的,您就可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM