代码之家  ›  专栏  ›  技术社区  ›  Pryore

在数据帧中使用符号的扩展函数

  •  2
  • Pryore  · 技术社区  · 7 年前

    我有一个非常简单的数据集,有两个变量。

    data <- data.frame(
                 ID = c("A","A","B","C","D","D"),
                 Service = c("Shop","Online","Shop","Online","Online","Shop"))
    

    我想使用 spread() Service ,而不是 spread 通过 ID ,我希望生成的表包含一个“Y”符号来表示 操作特定的服务。例如:

      ID       Shop    Online
      A         Y         Y
      B         Y         - 
      C         -         Y
      D         Y         Y
    

    然而 排列() 只给一个键函数是不起作用的,那么有没有一种方法可以使用现有的 传播 功能还是我必须使用不同的东西?

    2 回复  |  直到 7 年前
        1
  •  2
  •   markus    7 年前

    您需要先创建一个新列

    library(tidyr)
    library(dplyr)
    data %>% 
      mutate(spread_col = "Y") %>% 
      spread(Service, spread_col, fill = "-")
    #  ID Online Shop
    #1  A      Y    Y
    #2  B      -    Y
    #3  C      Y    -
    #4  D      Y    Y
    

    (这可能是 How to reshape data from long to wide format? )


    dcast 从 data.table reshape2 :

    reshape2::dcast(
      data,
      ID ~ Service,
      fun.aggregate = function(x) replace(x, x == x, "Y"),
      fill = "-"
    )
    
        2
  •  0
  •   Andre Elrico    7 年前

    你可以这样做 base .

    数据:(使用因子变量)

    data <- data.frame(
        ID = c("A","A","B","C","D","D"),
        Service = factor(c("Shop","Online","Shop","Online","Online","Shop")), levels = c("Online","Shop"))
    

    代码:

    ans<-
    do.call(
        rbind, tapply(data$Service, data$ID, table)
    )
    
    ans[ans == 1] = "Y"
    ans[ans == 0] = "-"
    

    结果:

    #> ans
    #  Online Shop
    #A "Y"    "Y" 
    #B "-"    "Y" 
    #C "Y"    "-" 
    #D "Y"    "Y" 
    #>