说,我有一个数据框
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])])
答案 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