Подмножество данных путем сопоставления значений с последующим запуском cumsum () в качестве частоты

Я уже давно зациклился на этом, и надеюсь, что это описание не слишком запутанно. По сути, у меня есть фрейм данных, который состоит из трех столбцов: участник, время и ответ, где каждого участника просят дать два ответа, по одному на каждый момент времени. Ниже представлена ​​иллюстрация:

> df[,c("participant", "time", "response")]

    participant    time response
1             1       3       18
2             1       4       17
3             4       3       15
4             4       4       10
5             7       3        5
6             7       4        0
7            10       3       10
8            10       4       10
9            13       3        0
10           13       4       10
11           16       3       15
12           16       4        5
13           19       3        5
14           19       4        5
15           22       3       25
16           22       4       15
17           25       3       13
18           25       4        0
19           28       3        0
20           28       4        0
21           31       3       25
22           31       4       18
23           34       3       15
24           34       4       15
25           37       3        1
26           37       4        4
27           40       3        5
28           40       4        5
29           43       3        5
30           43       4       15
31           46       3        5
32           46       4       12
33           49       3       15
34           49       4        0
35           52       3        3
36           52       4       12
37           55       3       20
38           55       4        0
39           58       3        5
40           58       4        5
41           61       3       13
42           61       4       10
43           64       3       10
44           64       4       10
45           67       3        3
46           67       4       15
47           70       3       13
48           70       4       20
49           73       3       12
50           73       4       60
51           76       3       10
52           76       4       10
53           79       3        2
54           79       4        0
55           82       3        5
56           82       4       10
57           85       3        8
58           85       4        4
59           88       3        0
60           88       4       15
61           91       3        5
62           91       4        5
63           94       3       15
64           94       4        5
65           97       3        0
66           97       4        5
67          100       3        2
68          100       4        8
69          103       3        5
70          103       4        5
71          106       3        5
72          106       4        5
73          109       3        9
74          109       4        9
75          112       3        3
76          112       4        7
77          115       3       20
78          115       4       25
79          118       3        5
80          118       4        4
81          121       3       10
82          121       4       10
83          124       3        2
84          124       4        4
85          127       3        5
86          127       4        5
87          130       3       18
88          130       4        8
89          133       3        0
90          133       4       10
91          139       3        5
92          139       4        5
93          142       3        7
94          142       4       12
95          145       3        5
96          145       4       13
97          148       3       26
98          148       4       20
99          151       3       13
100         151       4       21
101         154       3        5
102         154       4       15
103         157       3       10
104         157       4       10
105         160       3        5
106         160       4       15
107         163       3        5
108         163       4       15
109         166       3        0
110         166       4        1
111         169       3       13
112         169       4       21
113         172       3       25
114         172       4       25
115         175       3        5
116         175       4       14
117         178       3        5
118         178       4       15
119         181       3       10
120         181       4        0
121         184       3        5
122         184       4       15
123         190       3        3
124         190       4        4
125         193       3        5
126         193       4       15
127         196       3       15
128         196       4        5
129         199       3       25
130         199       4       25
131         202       3        5
132         202       4       15
133         205       3        0
134         205       4        2
135         208       3       13
136         208       4       22
137         211       3        2
138         211       4       10
139         214       3        3
140         214       4        3
141         217       3       15
142         217       4       11
143         220       3        0
144         220       4        2
145         223       3       40
146         223       4       35
147         226       3       24
148         226       4       24
149         229       3        5
150         229       4        5
151         232       3       10
152         232       4        5
153         235       3       16
154         235       4        0
155         238       3       17
156         238       4       19
157         241       3       20
158         241       4        5
159         244       3        5
160         244       4        5
161         247       3        0
162         247       4       15
163         250       3        3
164         250       4       13
165         253       3       20
166         253       4        4
167         256       3        5
168         256       4        5
169         259       3        3
170         259       4       19
171         262       3       25
172         262       4       25
173         265       3        0
174         265       4       15
175         268       3        5
176         268       4        3
177         271       3       22
178         271       4       22
179         274       3       25
180         274       4        5
181         277       3       15
182         277       4       15
183         280       3        5
184         280       4       15
185         283       3       17
186         283       4        9
187         286       3        5
188         286       4        5
189         289       3       15
190         289       4       10

Для каждого участника я хочу сравнить их ответ по времени 3 с их ответом по времени 4, чтобы совпадающие значения учитывались по отношению к этому конкретному значению в таблице частот cumsum. Ниже приведен пример, а не фактический результат:

0 3
1 5
2 7
3 9
4 11
5 12

, где первый столбец - это сами значения, а второй столбец - совокупная частота участников, которые выбрали один и тот же ответ в течение обоих временных точек (например, 3 участника выбрали ответ 0 для обоих временных точек, 5 участников выбрали ответ ‹ = 1, 7 участников выбрали отзыв ‹= 2 и т.д.).

Любые советы приветствуются.


person Community    schedule 13.01.2015    source источник
comment
Что определяет порядок желаемого результата?   -  person talat    schedule 13.01.2015
comment
@Khashaa - Что касается предложенного вами редактирования: OP показывает числовой вектор, а не dplyr tbl / data.frame. dplyr нигде не упоминается в этом вопросе. Это вторая ваша редакция, которую мне пришлось отклонить. Пожалуйста, будьте осторожны, когда редактируете сообщения людей.   -  person Rich Scriven    schedule 13.01.2015


Ответы (2)


Если вас интересует общая сумма для целей частоты, а не промежуточная текущая сумма, может помочь следующее. Учитывая следующие данные:

A <- '18 17 15 10  5  0 10 10  0 10 15  5  5  5 25 15 13  0  0  0 25 18 15 15  1  4  5 5  5 15  5 12 15  0  3 12 20  0  5  5 13 10 10 10  3 15 13 20 12 60 10 10  2  0 5 10  8  4  0 15  5  5 15  5  0  5  2  8  5  5  5  5  9  9  3  7 20 25  5  4 10 10  2  4  5  5 18  8  0 10  5  5  7 12  5 13 26 20 13 21  5 15 10 10  5 15  5 15 0  1 13 21 25 25  5 14  5 15 10  0  5 15  3  4  5 15 15  5 25 25  5 15  0  2 13 22  2 10  3  3 15 11  0  2 40 35 24 24  5  5 10  5 16  0 17 19 20  5  5  5  0 15 3 13 20  4  5  5  3 19 25 25  0 15  5  3 22 22 25  5 15 15  5 15 17  9  5  5 15 10'
B <- as.vector(as.matrix((read.table(text = A, colClasses = 'numeric'))))
Z1 <- rep(c(TRUE, FALSE), 190/2)
RawData <- data.frame(seq_len(95), B[Z1], B[!Z1])
names(RawData) = c('Participant', 'Time1', 'Time2')

библиотеку dplyr можно использовать так:

library(dplyr)
RD <- tbl_df(RawData)
Freq <- RD %>% mutate(Match = Time1 == Time2) %>% filter(Match == TRUE) %>% group_by(Time1) %>% summarise(n())

Что приводит к

  Time1 n()
1     0   1
2     3   1
3     5  12
4     9   1
5    10   5
6    15   2
7    22   1
8    24   1
9    25   3
person Avraham    schedule 13.01.2015
comment
Вы можете сделать то же самое с немного более коротким кодом dplyr, например: RD %>% filter(Time1 == Time2) %>% count(Time1) - person talat; 13.01.2015

Вот более длинный обзор с использованием только базовых функций, возможно, вы захотите использовать промежуточные объекты для дальнейшего использования:

Предположим, что объект mydf - это ваш data.frame со всеми вашими данными:

> head(mydf)
  participant time response
1           1    1       18
2           1    2       17
3           2    1       15
4           2    2       10
5           3    1        5
6           3    2        0

Используйте агрегатную функцию для сравнения значений одного и того же участника:

> mydf <- aggregate(response ~ participant, data = mydf, function(x){
  if (x[1] == x[2]){
    x[1]
  } else {
    NA
  }
})

Не обращайте внимания на неравных участников:

> mydf <- mydf[complete.cases(mydf), ]

и отсортируйте фрейм данных:

> mydf <- mydf[order(mydf$response), ]

Теперь вы можете создать таблицу и работать с ней для разных целей:

> mytable <- table(mydf$response)

> cumsum(mytable)
 0  3  5  9 10 15 22 24 25 
 1  2 14 15 20 22 23 24 27 
person ELCano    schedule 13.01.2015