查找数据表中第一个和最后一个匹配的索引

时间:2017-12-11 15:38:34

标签: r

我有一个类似于

的数据表
|userId|36|37|38|39|40|
|1|1|0|3|0|0|
|2|3|0|0|0|1|

其中每个编号的列(36-40)代表周数。我想计算第一次出现非零值和最后一次之前的周数。

例如,对于我的数据集中的userId 1,第一个值出现在第36周,最后一个值出现在第38周,因此我想要的值是2.对于userId 2,它是40-36,即4。 / p>

我想存储数据:

|userId|lifespan|
|1|2|
|2|4|

我很难做到这一点,有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

我将采用的一般方法是将其融合,将字符列名称转换为数字,并按每个userID取得delta。以下是使用data.table的示例。

library(data.table)
dt <- fread("userId|36|37|38|39|40
            1|1|0|3|0|0
            2|3|0|0|0|1",
            header = TRUE)

dt <- melt(dt, id.vars = "userId")
dt[, variable := as.numeric(as.character(variable))]
dt
#     userId variable value
#  1:      1       36     1
#  2:      2       36     3
#  3:      1       37     0
#  4:      2       37     0
#  5:      1       38     3
#  6:      2       38     0
#  7:      1       39     0
#  8:      2       39     0
#  9:      1       40     0
# 10:      2       40     1
dt[!value == 0, .(lifespan = max(variable) - min(variable)), by = .(userId)]
#    userId lifespan
# 1:      1        2
# 2:      2        4

答案 1 :(得分:0)

这是一个dplyr方法:

df %>%
  gather(var, value, -userId) %>%
  mutate(var = as.numeric(sub("X", "", var))) %>%
  group_by(userId) %>%
  slice(c(which.max(value!=0), max(which(value!=0)))) %>%
  summarize(lifespan = var[2]-var[1])

<强>结果:

# A tibble: 2 x 2
  userId lifespan
   <int>    <dbl>
1      1        2
2      2        4

数据:

df = read.table(text = "userId|36|37|38|39|40
1|1|0|3|0|0
2|3|0|0|0|1", header = TRUE, sep = "|")