通过匹配值来子集数据,然后将cumsum()作为频率运行

时间:2015-01-13 17:00:37

标签: r match 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等。)

非常感谢任何提示。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这是一个使用基本函数的更长的步骤,也许你想使用中间对象进一步使用:

假设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

使用aggregate函数比较同一参与者的值:

> 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