在有条件地重新开始计数的同时提供rownumber

时间:2017-05-04 15:37:10

标签: r

说,我有一个数据框

s<-c(rep(1,5),rep(2,5))
TF<-c('T','F','F','T','T','F','F','F','F','T')
df<-data.frame(s,TF)
df

我想知道所有T的rownumbers,但我想重新计算每个唯一s号的rownumber。所以,对于这个例子,我想得到:

s    rn1   rn2
1    1     4
2    5     10

实际上我有成千上万的案例,所以如果我能得到某种漂亮的代码来为我做这件事会非常有帮助。很感谢任何形式的帮助。 在我的尝试中,我无法弄清楚如何重新计算行数:

tapply(1:nrow(df), df$s, function(x)  x[which(df$TF[x])])

2 个答案:

答案 0 :(得分:1)

可能的解决方案:

> lapply(split(df, df$s), function(x) rownames(x)[x$TF == 'T'])
$`1`
[1] "1" "4" "5"

$`2`
[1] "10"

答案 1 :(得分:1)

使用dplyr的以下解决方案可以满足您的需求,但它保留了整洁的数据格式,而不是在列之间传播值。这是必要的,因为对于s = 1和s = 2,列数会有所不同 - 这是不可能的。

df %>%
    mutate(nr = row_number()) %>%
    filter(TF) %>%
    select(-TF)

输出结果为:

      s    nr
1     1     1
2     1     4
3     1     5
4     2    10