如何使用多个条件和匹配来创建新变量?

时间:2015-08-07 18:26:10

标签: r if-statement conditional match

我有以下数据

Name <- c("Kobe Bryant", "Kobe Bryant", "Kobe Bryant", 
          "Kobe Bryant", "Kobe Bryant", "Kobe Bryant", 
          "Lebron James", "Lebron James", "Lebron James", 
          "Lebron James", "Kevin Durant", "Kevin Durant",
          "Kevin Durant", "Kevin Durant", "Kevin Durant")

Date <- as.Date(c("2015-05-14", "2015-05-15", "2015-05-19", "2015-05-21", 
           "2015-05-24", "2015-05-28", "2015-05-14", "2015-05-20", 
           "2015-05-21", "2015-05-23", "2015-05-22", "2015-05-24", 
           "2015-05-28", "2015-06-02", ""2015-06-04"))

df <- data.frame c(Name, Date)

Desired_output <- c(1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0)

df2 <- data.frame c(Name, Date, Desired_output)

我想创建一个新列,用于识别特定玩家的背对背游戏(连续两天玩游戏)。

列的输出:1(如果b2b)0如果不是。

b2b的第一天和第二天都应该为1。

1 个答案:

答案 0 :(得分:1)

这是一个拆分 - 应用 - 合并问题(因为你需要单独处理每个玩家),你可以在R(by()aggregate(),...)或各种套餐(plyrdplyrdata.table)...此处为plyr()解决方案。

Name <- rep(c("Kobe Bryant", "Lebron James", "Kevin Durant"),
            c(6,4,5))
Date <- as.Date(c("2015-05-14", "2015-05-15", "2015-05-19",
  "2015-05-21","2015-05-12", "2015-05-28", "2015-05-14",
  "2015-05-16","2015-05-17", "2015-05-21", "2015-05-22",
  "2015-05-24","2015-05-28","2015-06-02","2015-06-10"))
dd <- data.frame(Name,Date)
b2b <- function(x,ind=FALSE) {
    x0 <- head(x,-1)  ## all but last
    x1 <- tail(x,-1)  ## all but first
    comp <- abs(head(x,-1)-tail(x,-1))==1
    res <- c(comp,FALSE) | c(FALSE,comp)
    if (ind) {
        w <- res==1 & c(0,res[-length(res)])==1
        res[w] <- 2
    }
    return(res)
}
library("plyr")
ddply(dd,"Name",
      transform,
         b2b=as.numeric(b2b(Date)),
         b2b_ind=as.numeric(b2b(Date,ind=TRUE)))

我的代码按字母顺序自动重组了玩家(因为玩家变成了按字母顺序排列的因子,ddply以此重新排列的顺序返回数据)。如果这很重要,您可以确保在开始之前按照您想要的方式对因子进行排序。