请考虑以下事项。
使用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)
包的想法(我想一个人可以一次完成所有操作)。
非常感谢您提供任何帮助!
答案 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