[英]I am having to create dummy variables in this very specific way. Can someone help me package this code into a function?
respect$BB6_cat5_0 <- ifelse(respect$BB6_cat5 == 1, 1, 0)
respect$BB6_cat5_1 <- ifelse(respect$BB6_cat5 == 2, 1, 0)
respect$BB6_cat5_2 <- ifelse(respect$BB6_cat5 == 3, 1, 0)
respect$BB6_cat5_3 <- ifelse(respect$BB6_cat5 == 4, 1, 0)
respect$BB6_cat5_4 <- ifelse(respect$BB6_cat5 == 5, 1, 0)
respect$J1A_cat2_0 <- ifelse(respect$J1A_cat2 == 1, 1, 0)
respect$J1A_cat2_1 <- ifelse(respect$J1A_cat2 == 2, 1, 0)
類別長度因變量而異,虛擬變量的命名對我的項目非常重要。
我嘗試了以下操作,但是由於model.matrix的工作原理,因此省略了參照變量。
dummy.fun<-function(data) {
data_factor<-data.frame(lapply(data,as.factor))
names(data_factor)<-paste0(names(data_factor),'_')
data_all<-data.frame(model.matrix(~.+0,data=data_factor))
}
dummy.fun(respect)
但是,除非它是數據集中的第一個變量,否則它不會給我BB6_cat5_0。 我有什么想法可以使該函數輸出所有虛擬變量,甚至包括參考對象?
我敢肯定,有一種更好的方法可以做到這一點(雙重for循環並不是一件令人愉快的事情),但是以下方法可以滿足您的要求:
respect <- list(BB6_cat5 = 1,BB6_cat0 = 2, BB6_cat1 = 3)
respect_names <- names(respect)
for(pos in 1:length(respect_names)){
for(i in 0:4) respect[[paste0(respect_names[pos],"_",i)]] = ifelse(respect[[(respect_names[pos])]] == (i+1),1,0)
}
respect
第一級循環遍歷原始命名項。 第二層遍歷您要測試的值。 它使用[[]]語法將值添加到列表中並保持測試的一致性。
嘗試使用此功能:
# Sample data:
set.seed(123)
df <- data.frame(a = sample(letters[1:3], 10, replace = T),
b = sample(1:2, 10, replace = T))
# Function:
vars_to_dummy <- function(df, vars) {
stopifnot(all(vars %in% names(df)))
for (i in vars) {
dummy_names <- sort(unique(df[[i]]))
dummy_i <- as.data.frame(
sapply(dummy_names, function(x) {
(df[[i]] == x)*1
}, USE.NAMES = TRUE)
)
names(dummy_i) <- paste(names(df[i]), dummy_names, sep = "_")
df <- cbind(df, dummy_i)
}
return(df)
}
# Try that:
vars_to_dummy(df, vars = c("a", "b"))
> vars_to_dummy(df, vars = c("a", "b"))
a b a_a a_b a_c b_1 b_2
1 a 2 1 0 0 0 1
2 c 1 0 0 1 1 0
3 b 2 0 1 0 0 1
4 c 2 0 0 1 0 1
5 c 1 0 0 1 1 0
6 a 2 1 0 0 0 1
7 b 1 0 1 0 1 0
8 c 1 0 0 1 1 0
9 b 1 0 1 0 1 0
10 b 2 0 1 0 0 1
編輯:
df
是您的數據幀, vars
是一個字符向量,表示您想要虛擬變量的列名。
dummy.fun<-function(data) {
data_factor<-data.frame(lapply(data,as.factor))
names(data_factor)<-paste0(names(data_factor),'_')
data_all<-data.frame(model.matrix(~.+0,data=data_factor,
contrasts.arg=lapply(data_factor[sapply,as.factor],contrasts,contrasts=FALSE)))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.