如何根据前面的列插入/替换列中的值?

时间:2016-12-07 13:33:18

标签: r

我收到了一个交易日志,我跟踪学生登录学习管理系统(LMS)。我已经设法将数据传播到数周。结果data.frame看起来如下:

UserID   31        32        33        34        35
user1    active    active    n/a       n/a       active
user2    n/a       n/a       active    active    n/a
user3    active    n/a       n/a       active    active

我需要根据前面的值插入或替换列值,如下所示:

UserID     31       32       33       34       35
user1      new      recur    drop     drop     recur
user2      n/a      n/a      new      recur    drop
user3      new      drop     drop     recur    recur

这是为了向学生显示登录模式,这些模式首次区分新用户日志记录,重复用户和未在特定周内登录的用户。

1 个答案:

答案 0 :(得分:0)

可以使用duplicated函数。

也许有点像这样冗长但是:

df <- data.frame(user1=c('n/a','active','n/a','active'),
                 user2=c('n/a','n/a','n/a','n/a'),
                 user3=c('active','n/a','active','n/a'),
                 user4=c('active','active','active','active'),
                 stringsAsFactors = FALSE)

recode_col <- function(col) {
  coldup <- duplicated(col)
  colna <- col=='n/a'
  col[!coldup&!colna] <- 'new'
  col[coldup&!colna] <- 'recur'
  col[colna] <- 'drop'
  first_nonna <- which(!colna)[1]
  if (is.na(first_nonna)) first_nonna <- length(col)+1
  col[1:first_nonna-1] <- 'n/a'
  col
}

lapply(df, recode_col)