我对R来说很新。我有一组数据,我想按照第一个的顺序重新排列,最后一个,最后一个,等等。所以例如说我的数据看起来像这样:
user | Event | count |
use1 | start | 1 |
use1 | start | 2 |
use1 | stop | 3 |
use1 | stop | 4 |
我希望它能返回这样的东西:
user | Event | count |
use1 | start | 1 |
use1 | stop | 4 |
use1 | start | 2 |
use1 | stop | 3 |
任何帮助表示赞赏! 谢谢!
答案 0 :(得分:3)
(问题更新后编辑)
好的,既然你已经更新了你的问题,那么所涉及的步骤就是 略有不同:
library(dplyr)
df %>%
group_by(user, Event) %>%
mutate(rank_by_event = rank(count),
reverse_rank = max(rank_by_event) - rank_by_event + 1,
pair = ifelse(Event == "start", rank_by_event, reverse_rank)) %>%
arrange(user, pair, Event)
# Output:
user Event count rank_by_event reverse_rank pair
<fctr> <fctr> <int> <dbl> <dbl> <dbl>
1 use1 start 1 1 2 1
2 use1 stop 4 2 1 1
3 use1 start 2 2 1 2
4 use1 stop 3 1 2 2
这是否应该在每个用户或整体内发生并不完全清楚,如果您没有获得所需的结果,您可能希望将group_by(user, Event)
更改为group_by(Event)
。
答案 1 :(得分:2)
假设OP正在寻求颠倒data.frame的顺序,然后与原始data.frame交织,并且每个用户有一个偶数行,这里有一个使用data.table
的解决方案
library(data.table)
dt <- data.table(user="use1", Event=c("start", "start", "stop", "stop"), count=seq_len(4))
dt[, {
#number of rows for this user
n <- .N
#generate the row indices by interweaving the ordered with the reverse ordered
idx <- as.vector(rbind(seq_len(n), rev(seq_len(n))))
#take only the first half of the indices
idx <- idx[seq_len(length(idx)/2)]
#indexing and return
.SD[idx]
}, by=.(user)]
这是使用base
包的另一种选择:
df <- data.frame(user="use1", Event=c("start", "start", "stop", "stop"), count=seq_len(4))
do.call(rbind, by(df, df$user, function(x) {
n <- nrow(x)
idx <- as.vector(rbind(seq_len(n), rev(seq_len(n))))
idx <- idx[seq_len(length(idx)/2)]
x[idx,]
}))