จะจัดกลุ่มตัวแปรให้เป็นมาตรฐาน / มาตรฐานใน R ได้อย่างไร?


9

ฟังก์ชั่นที่ฉันคุ้นเคยกับขนาดสเกลจากฐาน R, rescaleจาก ARM

บางทีวิธีที่ดีที่สุดคือการใช้ตัวแปรบางส่วนของการใช้งานโดยระบุตัวแปรอย่างน้อยหนึ่งตัวเพื่อใช้เป็นตัวแปรการจัดกลุ่ม


ลอง: รวม (state.x77, รายการ (ภูมิภาค = state.region, เย็น = state.x77 [, "Frost"]> 130)), ฟังก์ชัน (x) ((x - หมายถึง (x)) / sd (x) ))
suncoolsu

คำตอบ:


7

นี่เป็นวิธีแก้ปัญหาplyr ที่เป็นไปได้ โปรดทราบว่ามันขึ้นอยู่กับtransform()ฟังก์ชั่นฐาน

my.df <- data.frame(x=rnorm(100, mean=10), 
                    sex=sample(c("M","F"), 100, rep=T), 
                    group=gl(5, 20, labels=LETTERS[1:5]))
library(plyr)
ddply(my.df, c("sex", "group"), transform, x.std = scale(x))

(เราสามารถตรวจสอบว่ามันทำงานได้ตามที่คาดหวังด้วยเช่น, with(subset(my.df, sex=="F" & group=="A"), scale(x)))

โดยพื้นฐานแล้วอาร์กิวเมนต์ที่ 2 อธิบายวิธี "แยก" ข้อมูลอาร์กิวเมนต์ที่ 3 คือฟังก์ชันใดที่ใช้กับแต่ละกลุ่ม ด้านบนจะผนวกตัวแปรx.stdเข้ากับ data.frame ใช้xหากคุณต้องการแทนที่ตัวแปรดั้งเดิมด้วยตัวแปรที่ปรับขนาด



3

นี่คือโซลูชันdata.table มันเร็วกว่า plyr (เกี่ยวข้องกับชุดข้อมูลขนาดใหญ่เท่านั้น) บางทีในภายหลังฉันจะทำตัวอย่าง dplyr

# generate example data
raw.data <- data.frame( outcome = c(rnorm(500, 100, 15), rnorm(500, 110, 12)), 
                        group = c(rep("a", 500), rep("b", 500)))

library(data.table)
# convert dataframe to data.table
raw.data <- data.table(raw.data, key = "group")

# create group standardized outcome variable
raw.data[ , group_std_outcome := (outcome - mean(outcome, na.rm = TRUE)) /  
           sd(outcome, na.rm = TRUE), "group"]

(ใช่ฉันค้นพบคำถามที่ฉันถามเมื่อหลายปีก่อนตอนที่ฉันเป็น R noob;)


2

คุณสามารถใช้ (ในหมู่อื่น ๆ ) tapplyสำหรับplyrแพคเกจนี้ (มีแพ็คเกจตัวเลือกอื่น ๆ อีกมากมายที่อาจจะเหมาะสมกว่าสำหรับสถานการณ์เฉพาะของคุณ):

tapply(variabletoscale, list(groupvar1, groupvar2), scale)

1
ด้วยสองปัจจัยมันจะไม่ส่งคืนข้อมูลเฟรม คุณจะต้องดำเนินการตามผลลัพธ์หลังการประมวลผล
chl

0

คำตอบนี้มาจากกระดาษสีขาวโดย Mahmood Arai มันมีผลข้างเคียงที่สะดวกของการติดฉลากผลลัพธ์ที่กึ่งกลางด้วยคำนำหน้า "C":

gcenter <- function(df1,group) {
        variables <- paste(
              rep("C", ncol(df1)),  colnames(df1), sep=".")
        copydf <- df1
        for (i in 1:ncol(df1)) {
              copydf[,i] <- df1[,i] - ave(df1[,i], group, FUN=mean)}
        colnames(copydf) <- variables
        return(cbind(df1,copydf))}

0

นี่คือการดำเนินการปรับปรุงโดยใช้dplyrจากtidyverse

library(tidyverse)

my.df <- data.frame(x=rnorm(100, mean=10), sex=sample(c("M","F"), 100, rep=T))
my.df <- group_by(my.df, sex) %>% mutate(x.sd = as.numeric(scale(x)))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.