Я работаю над проектом и ищу некоторую помощь, чтобы сделать мой код более эффективным.Я искал похожие проблемы, но не могу найти ничего более гранулированного, чем этот.Решение, которое я придумала, чрезвычайно неуклюже.Я уверен, что должен быть более эффективный способ сделать это с пакетом типа dplyr
, data.tables
и т. Д.
Проблема: У меня есть 3 столбца данных,'ids'
, 'x.group'
и 'times'
.Мне нужно извлечь первые 3 уникальных 'ids'
, которые появляются в каждом блоке 'times'
для каждого 'x.group'
.
Однако я не хочу включать любые 'ids'
или 'x.group'
, равные "0".Вывод внизу моего кода дает правильные значения, но, по моему мнению, это довольно неловкий способ.
Примечание. В приведенном ниже примере кода я использую x.groups = ['A','B','0']
, но в моемВ реальном проекте они могут принимать много значений, поэтому они не всегда будут «A» или «B», но всегда будут присутствовать «0» (например, у меня может быть ['A','K','0']
или ['M','W','0']
и т. д.).Вы можете найти пример набора данных внизу этого поста.
# find x.groups
xs <- unique(myDF$x.group)[unique(myDF$x.group) != "0"]
# DF without '0's as x.group entries
ps <- unique(myDF[which(myDF$x.group %in% xs) , c("ids","x.group","time")])
first3.x1.t1 <- ps[ps$x.group == xs[1] & ps$ids != "0" & ps$time == "1", ]$ids[1:3]
first3.x2.t1 <- ps[ps$x.group == xs[2] & ps$ids != "0" & ps$time == "1", ]$ids[1:3]
first3.x1.t2 <- ps[ps$x.group == xs[1] & ps$ids != "0" & ps$time == "2", ]$ids[1:3]
first3.x2.t2 <- ps[ps$x.group == xs[2] & ps$ids != "0" & ps$time == "2", ]$ids[1:3]
first3.x1.t3 <- ps[ps$x.group == xs[1] & ps$ids != "0" & ps$time == "3", ]$ids[1:3]
first3.x2.t3 <- ps[ps$x.group == xs[2] & ps$ids != "0" & ps$time == "3", ]$ids[1:3]
# First 3 unique ids from time block 1 for each x.group
> first3.x1.t1; first3.x2.t1;
[1] "2" "17" "11"
[1] "5" "10" "4"
# First 3 unique ids from time block 2 for each x.group
> first3.x1.t2; first3.x2.t2;
[1] "9" "6" "16"
[1] "8" "13" "7"
# First 3 unique ids from time block 3 for each x.group
> first3.x1.t3; first3.x2.t3;
[1] "11" "2" "10"
[1] "1" "3" "13"
Данные:
# create data frame
ids <- c("2","0","15","5","17","10","4","2","3","11","11","18","10","8","13","9","6","16","7","14",
"16","7","11","12","14","5","1","11","3","2","10","17","3","13","10","17","2","10","16","10")
x.group <- c("A","A","0","B","A","B","B","A","B","A","A","0","B","B","B","A","A","A","B","B",
"A","A","0","B","A","B","B","A","B","A","A","0","B","B","B","A","A","A","B","B")
time <- c(rep("1",13), rep("2",13), rep("3",14))
myDF <- as.data.frame(cbind(ids, x.group, time), stringsAsFactors = FALSE)
> myDF
ids x.group time
1 2 A 1
2 0 A 1
3 15 0 1
4 5 B 1
5 17 A 1
6 10 B 1
7 4 B 1
8 2 A 1
9 3 B 1
10 11 A 1
11 11 A 1
12 18 0 1
13 10 B 1
14 8 B 2
15 13 B 2
16 9 A 2
17 6 A 2
18 16 A 2
19 7 B 2
20 14 B 2
21 16 A 2
22 7 A 2
23 11 0 2
24 12 B 2
25 14 A 2
26 5 B 2
27 1 B 3
28 11 A 3
29 3 B 3
30 2 A 3
31 10 A 3
32 17 0 3
33 3 B 3
34 13 B 3
35 10 B 3
36 17 A 3
37 2 A 3
38 10 A 3
39 16 B 3
40 10 B 3