R:在另一个和部分订单值上有条件地订购一列

时间:2015-06-19 07:49:22

标签: r

我有转发的数据框

set.seed(28100)
    df <- data.frame(user_id = sample(1:8, 10, replace = TRUE),
                 timestamp = sample(1:1000, 10),
                 retweet = sample(999:1002, 10, replace=TRUE))
df <- df[with(df, order(retweet, -timestamp)),]
df
# user_id timestamp retweet
# 6        8       513     999
# 9        7       339     999
# 3        3       977    1000
# 2        3       395    1000
# 5        2       333    1000
# 4        5       793    1001
# 1        3       873    1002
# 8        2       638    1002
# 7        4       223    1002
# 10       6        72    1002

每个retweet都有一个唯一的ID。对于每一行,我想根据链或转推的逆序为用户分配排名。排名应该估计每个用户的影响:链越长,早期twitterer的点越高。换句话说,我想基于timestamp对每个转发链进行排名,并为之前转发它的人分配更高的分数。如果两个用户同时发布了相同的转推,那么他们应该分配相同的排名。

df

df$ranking <- c(1,2, 1,2,3, 1, 1,2,3,4)
aggregate(ranking~user_id, data=df, sum)

#   user_id ranking
# 1       2       5
# 2       3       4
# 3       4       3
# 4       5       1
# 5       6       4
# 6       7       2
# 7       8       1

1 个答案:

答案 0 :(得分:1)

使用数据表:

library(data.table)
setDT(df)[order(-timestamp), ranking2 := seq_len(.N), by = retweet]
df[, sum(ranking2), keyby = user_id]
#    user_id V1
# 1:       2  5
# 2:       3  4
# 3:       4  3
# 4:       5  1
# 5:       6  4
# 6:       7  2
# 7:       8  1