我有以下data.frame:
dat <- data.frame(bifpar = c(0.5, 0.75, 1.0), sd_distfeed = rep(2,3), sd_nodist = rep(3,3), mean_distfeed = rep(10,3), mean_nodist = rep(20,3))
dat
bifpar sd_distfeed sd_nodist mean_distfeed mean_nodist
1 0.50 2 3 10 20
2 0.75 2 3 10 20
3 1.00 2 3 10 20library('tidyverse')
dat %>%
mutate_at(vars(matches("dist")), ~ (. / mean_nodist))
bifpar sd_distfeed sd_nodist mean_distfeed mean_nodist
1 0.50 0.1 0.15 0.5 1
2 0.75 0.1 0.15 0.5 1
3 1.00 0.1 0.15 0.5 1它工作得很好,但如果我按列mean_distfeed缩放,则不会缩放右侧的列:
dat %>%
mutate_at(vars(matches("dist")), ~ (. / mean_distfeed))
bifpar sd_distfeed sd_nodist mean_distfeed mean_nodist
1 0.50 0.2 0.3 1 20
2 0.75 0.2 0.3 1 20
3 1.00 0.2 0.3 1 20如何按单个列缩放选定的列,而与其在data.frame中的位置无关?
我使用的是R版本4.0.2和tidyverse版本1.3.0
发布于 2020-12-03 19:56:06
我现在找不到任何与此相关的文档、github问题或stackoverflow答案(但我在某个地方看到过)。
无论如何,原因是mutate_at使用更新的mean_distfeed值来划分mean_nodist。
对于此操作:
library(dplyr)
dat %>% mutate_at(vars(matches("dist")), ~ (. / mean_distfeed))以第一行为例,计算如下:
sd_distfeed - 2/10
sd_nodist - 3/10
mean_distfeed - 10/10请注意,由于10/10,mean_distfeed值现在已更新为1。因此,对于下一列,将发生以下情况-
mean_nodist - 20/1因此,您将获得相同的值。
解决方案是保持列在最后划分,以避免这种情况发生。然而,正如其他人所指出的那样,这个错误已经在across中修复了。
发布于 2020-12-03 19:28:57
mutate_at已被取代。请尝试改用mutate(across(...语法:
dat %>% mutate(across(contains("dist"), ~ . / mean_distfeed))
#> bifpar sd_distfeed sd_nodist mean_distfeed mean_nodist
#> 1 0.50 0.2 0.3 1 2
#> 2 0.75 0.2 0.3 1 2
#> 3 1.00 0.2 0.3 1 2https://stackoverflow.com/questions/65124898
复制相似问题