簡體   English   中英

我必須以這種非常特定的方式創建虛擬變量。 有人可以幫我將此代碼打包成一個函數嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM