[英]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.