【问题标题】:R Converting Factors into New VariablesR 将因子转换为新变量
【发布时间】:2016-11-14 16:59:35
【问题描述】:

我有两个具有多个级别的变量; V1 有 400 个级别,V2 有 ≈ 250 个级别。如何将 V2 的因子转换为几个不同的变量并使用变量 V1 作为唯一标识符?

V1             V2
Garza, Mike    a
Garza, Mike    b
Smith, James   a 
Smith, James   f 
Smith, James   z 
Moore, Jen     b
Klein, April   f

数据框应如下例所示。注意:变量如何包含多个因素,而不是每个因素一个变量。考虑到 Mike 有两个与他相关的因素,因素 a 和 b 进入 V2 和 V3,其中 Jen,因素 b 也进入 V2,而不是 V3。

V1             V2 V3 V4 V5
Garza, Mike    a  b
Smith, James   a  f  z
Moore, Jen     b
Klein, April   f

任何帮助将不胜感激!

谢谢。

【问题讨论】:

    标签: r reshape reshape2


    【解决方案1】:

    这是一个重塑问题。考虑df 是你的data.frame,你可以试试这个:

    > library(reshape2)
    > print(dcast(melt(df), ...~V2), na.print="")
    Using V1, V2 as id variables
    Using V2 as value column: use value.var to override.
               V1 a b f z
    1  Garza,Mike a b    
    2 Klein,April     f  
    3   Moore,Jen   b    
    4 Smith,James a   f z
    

    【讨论】:

    • 您好吉尔伯,感谢您的回复!你能再看一遍帖子吗?我做了一点修改,这样我的问题就更清楚了。谢谢。
    【解决方案2】:

    您可以使用reshape 包中的dcast 执行第一部分,然后使用apply 将它们进一步排序为您想要的输出。

    dat <- data.frame(V1 = factor(c("Garza", "Garza",
                              "Smith", "Smith", "Smith",
                              "Moore", "Klein")),
                      V2 = c("a","b","a","f","z","b","f"))
    
    # recast your data
    dd <- dcast(dat, V1~V2)
    
    #make a function to use with apply
    
    shift_values<- function(x){
      notna <-which(!is.na(x[-1]))
      val <- x[notna+1]
      x[-1] <- c(as.character(val), rep("", (length(x)-1-length(val))))
      return(x)
    }
    
    # use it in an apply loop, transpose the data, and turn it into a data.frame
    result <- data.frame(t(apply(dd, 1, shift_values)))
    
    # change the column names
    colnames(result)[-1] <- paste0("V", 2:(ncol(result)))
    

    然后数据如下所示:

         V1 V2 V3 V4 V5
    1 Garza  a  b      
    2 Klein  f         
    3 Moore  b         
    4 Smith  a  f  z   
    

    【讨论】:

      【解决方案3】:

      您似乎想要一个包含每个V1 级别(个人)的V2 级别的向量。这不是真正列在 data.frames 中的设计方式,即使您可以在 Excel 中做到这一点。相反,我建议您将结果作为每个人的向量,如下所示:

      split(df$V2, df$V1)
      

      返回:

      $`Garza, Mike`
      [1] a b
      Levels: a b f z
      
      $`Klein, April`
      [1] f
      Levels: a b f z
      
      $`Moore, Jen`
      [1] b
      Levels: a b f z
      
      $`Smith, James`
      [1] a f z
      Levels: a b f z
      

      在不了解您的用例的情况下,我不能说这是否真的会更好。但是,根据我的一般经验,它往往更容易使用。如果您只需要打印它们,您可以随时折叠它们。例如,如果您将上述split 结果保存到out,您可以这样做,然后可以将其作为列添加到其他输出表中:

      out <- split(df$V2, df$V1)
      
      sapply(out, paste, collapse = ", ")
      

      给予

       Garza, Mike Klein, April   Moore, Jen Smith, James 
            "a, b"          "f"          "b"    "a, f, z" 
      

      或者,如果你想知道谁拥有某个组,你可以这样做:

      sapply(out, function(x){"f" %in% x})
      

      这给出了:

       Garza, Mike Klein, April   Moore, Jen Smith, James 
             FALSE         TRUE        FALSE         TRUE 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多