在R中重新排列表格

时间:2017-04-06 01:43:50

标签: r

我对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    |

任何帮助表示赞赏! 谢谢!

2 个答案:

答案 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,]
}))