簡體   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