【问题标题】:I am having to create dummy variables in this very specific way. Can someone help me package this code into a function?我必须以这种非常具体的方式创建虚拟变量。有人可以帮我把这段代码打包成一个函数吗?
【发布时间】:2018-01-11 15:19:52
【问题描述】:
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。有什么想法可以让这个函数输出所有虚拟变量,甚至是所指对象?

【问题讨论】:

  • 请提供一个最小的工作示例,即数据、代码和预期输出。
  • 我不认为该代码永远会为您提供 BB6_cat5_0,因为“_”之后没有参数,并且 R 索引从 1 开始,而不是 0。跨度>
  • 看起来您想要的正是model.matrix 给出的内容,但名称不同。只需修改名称而不是编写所有这些 ifelse 语句。如果您发布示例输入,我们可以提供帮助/

标签: r function dummy-variable


【解决方案1】:

我确信有更好的方法来做到这一点(双 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

第一级循环遍历原始命名项。第二级循环通过您希望测试的值。它使用 [[]] 语法向列表中添加值并保持测试一致。

【讨论】:

    【解决方案2】:

    试试这个功能:

    # 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 是一个字符向量,表示您希望为其设置假名的列名。

    【讨论】:

      【解决方案3】:
      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)))
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 2015-07-14
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        相关资源
        最近更新 更多