繁体   English   中英

R中使用plyr(ddply)进行技巧重缩放

[英]Trick rescaling with plyr (ddply) in R

我有这个csv表,我需要为每列在0和1之间重新缩放数据。 也就是说,任何给定列的最小值将是0,最大值将是1,所有其他值将相应地线性缩放。 这是我的脚本:

tableau  <- read.csv(text="Net,B,C,D,E (e),F (f)
a,1.88,0.15,0.6,10,90
b,2.05,0.23,0.51,55,80
c,2.09,0.29,0.4,58,88
d,2.07,0.52,0.36,80,84
e,2.13,0.3,0.27,7,90")
tableau.m <- melt(tableau)
tableau.m <- ddply(tableau.m, .(variable), transform,rescale = rescale(value))

问题是第一段不是完全正确:重新缩放应按列进行,最后两列除外:我需要根据两列的最低值一起对“ Ee”和“ Ff”进行重新缩放,和两列的最大值。 也就是说,仅对于这些列而不是其他列,最小值应为7(显示为白色),而最大值应为90(显示为深蓝色)。

因此,在Ff列中,所有单元格都应显示为深蓝色。

使用plyr可以实现这一目标吗?

在此处输入图片说明

(在此示例中,B列应以2.13表示白色,1.88表示深蓝色,并相应地缩放2.07、2.09、2.05的阴影。另一列应保持不变。)

您可以使用ifelse语句根据EeFf值的组合范围(而不是每个单独的值组的范围)来缩放EeFf值:

tableau.m = ddply(tableau.m, .(variable), transform,
                  rescale = ifelse(variable %in% c("E.e","F.f"), 
                                   rescale(value,
                                           from=range(value[variable %in% c("E.e","F.f")])),
                                   rescale(value)))

更新:看到您的评论后,我意识到我的原始代码不正确。 我们已经要求plyrvariable分组,因此它无法同时查看两个单独的variable值以获取正确的rescale范围。

这是更新的代码,可从整个数据帧获取正确的范围。 它可以工作,但可以通过“超出” plyr分组功能的环境来实现,这对我而言似乎并不十分优雅(在某些情况下甚至可能产生意想不到的后果)。

tableau.m = ddply(tableau.m, .(variable), transform,
                  rescale=ifelse(variable %in% c("E.e","F.f"), 
                                 rescale(value,
                                         from=range(tableau.m$value[tableau.m$variable %in% c("E.e","F.f")])),
                                 rescale(value)))

我知道你问一个plyr的答案,但这里有一个dplyr一个为别人谁来找:

library(dplyr)
library(scales)
library(tidyr)

tableau %>% 
  mutate_each(funs(rescale), B, C, D) %>% 
  mutate_each(funs(rescale(., from=range(tableau[,5:6]))), 5, 6) %>% 
  gather(variable, rescale, -Net) %>% 
  left_join(gather(tableau, variable, value))

暂无
暂无

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

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