我有一个类似于
的数据表|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|
我很难做到这一点,有人可以帮忙吗?
答案 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 = "|")