排名或填充使用plyr创建的列表

时间:2018-03-07 16:45:29

标签: r dplyr

请考虑以下事项。

使用master包中的dlply,我根据"主题ID"将数据帧拆分为列表。和另一个表示时间顺序的变量。我收到按ID和时间顺序命名的列表(10.1,10.2,10.3等)。

使用plyr我将一个函数应用于上一个操作,并接收一个类似于此的数据框:

ldply

我现在想要引入一个基于始终以' 1'开头的ID的列。期望的结果如下:

> db <- data.frame(ID = c(10.1, 10.2, 10.3, 11.2, 11.3, 12.2))
> db
    ID
1 10.1
2 10.2
3 10.3
4 11.2
5 11.3
6 12.2

它尝试再次使用> result <- data.frame(ID = c(10.1, 10.2, 10.3, 11.2, 11.3, 12.2), + rank = c(1, 2, 3, 1, 2, 1)) > result ID rank 1 10.1 1 2 10.2 2 3 10.3 3 4 11.2 1 5 11.3 2 6 12.2 1 根据ID创建列表,然后在名为&#39; rank&#39;的列中填写这些列表。但是因为每个ID都会创建一个列表(即一个用于10.1,10.2,10.3),我首先需要使用

dlply

按ID创建列表,而不是每个&#39; ID。但是我仍然不知道如何填写专栏#rank;#39;在这些清单中。

我确信有更好的方法可以做到这一点,也许我不完全理解db$pure.ID <- substr(db$ID, 1, nchar(db$ID) - 2) 包的想法(我想一个人可以一次完成所有操作)。

非常感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:1)

如果您的ID变量是数字的,如db所示,您可以考虑将ID变量向下舍入并将其用作分组变量。然后,您可以添加一个row_number()

的计数器
db %>% group_by(floor(ID)) %>% mutate(rank = row_number()) %>% 
                ungroup() %>% select( - `floor(ID)`)

#      ID  rank
# 1  10.1     1
# 2  10.2     2
# 3  10.3     3
# 4  11.2     1
# 5  11.3     2
# 6  12.2     1