我有以下数据集:
id pnum t1 t2 t3 w1 w2 w3
1 1 w r r 1 1 1
1 2 o o w 0 0 1
1 3 o w w 1 1 1
2 1 o w t 1 0 1
2 2 s s s 1 0 1
2 3 s s s 1 0 1
Id
定义组成员身份。
基于id
和PNUM我想识别common
与报告的测量pnum 3
在时间t
就w
。
换句话说id
,pnum
定义进行测量的不同个人。在某些情况下,测量是一起进行的,而在其他情况下,测量是单独进行的。如果把它们放在一起比'w'
我们拥有价值1
。
For example:
Common activities at time t:
Id 1
pnum 1
在t1
(例如1
)的报道中,该组进行了测量,更具体地说是使用id1/pnum3
。如果两个组的测量数据共同使用,我想保存它。
Uncommon activities at time t:
Id 2
pnum 1
在t1处报道的(例如1),一个测量是与来自基团,更具体地id2/pnum2
,并pnum 3.
在这种情况下一起测量数据之间罕见id2/pnum1
和pnum 2
作为阱之间id2/pnum1
和pnum 3
。我不想保存这些度量。但是,我想保存之间的一个共同的报告id2/pnum2
和pnum 3.
Generic example id 1:
在ID为1的组中,t1处的pnum1和pnum3进行了测量。Pnum 1
报道w
,pnum 2
并pnum 3
报道o
。这意味着pnum 2
与pnum 3
报告的测量结果相同。但是,当我看着W1我可以观察到,他们不在一起的时候,他们就照在w1
pnum 2
是0
和pnum 3
是1
。换句话说,即使度量是通用的,pnum 2
并且pnum 3
由于它们没有被合并在一起,所以我也不想保存这种情况。我需要报告他们是否报告了相同的测量结果。在这种情况下,pnum1在报告w
时pnum 3
报告o
,因此测量值不匹配。因此我编码0
。我不想保存案件。
我想确定在时间t一起进行的常见测量。
输出:
id pnum t1 t2 t3
1 1 0 0 0
1 2 0 0 w
1 3 0 s w
2 1 0 0 0
2 2 s 0 s
2 3 s 0 s
样本数据:
df<-structure(list(id=c(1,1,1,2,2,2),pnum=c(1,2,3,1,2,3), t1=c("w","o","o","o","s","s"), t2=c("r","o","w","w","s","s"),t3 = c("r","w","w","t","s","s"), w1= c(1,0,1,1,1,1), w2 = c(1,0,1,0,0,0), w3 = c(1,1,1,1,1,1)), row.names = c(NA, 6L), class = "data.frame")
我不明白为什么在您的预期输出中有一个“ s” [id1, pnum3, t2]
-除此之外,我认为以下内容可能对您有所帮助:
首先,将数据转换为“更长的”格式(可以按时间分组)可以帮助您通用化代码。
library(dplyr)
library(tidyr)
df_longer <- df %>%
pivot_longer(
cols = matches("^[tw]\\d+$"),
names_to = c(".value","time"),
names_pattern = "([tw])(\\d+)"
)
上面将您的数据设置为如下所示:
> head(df_longer)
# A tibble: 6 x 5
id pnum time t w
<dbl> <dbl> <chr> <chr> <dbl>
1 1 1 1 w 1
2 1 1 2 r 1
3 1 1 3 r 1
4 1 2 1 o 0
5 1 2 2 o 0
6 1 2 3 w 1
现在,您可以轻松地将其归类,并确定在任何给定时间给出共同答案的个人:
common_answers <- df_longer %>%
arrange(id, time, pnum) %>%
filter(w == 1) %>% # throw out if the answer was given individually
select(-w) %>% # w not needed anymore
group_by(id, time, t) %>% # group by selected answer
filter(n() > 1) %>% # keep only answers given >1 times
ungroup()
这仅向您提供一组经过过滤的数据,而这些数据通常是在分组中给出的:
> common_answers
# A tibble: 6 x 4
id pnum time t
<dbl> <dbl> <chr> <chr>
1 1 2 3 w
2 1 3 3 w
3 2 2 1 s
4 2 3 1 s
5 2 2 3 s
6 2 3 3 s
//添加:
如果必须在输出中使用“宽”格式,则可以保留所有数据,并进行修改,t
以便仅在> 1主题共同给出的情况下才保留其值,然后再次扩大df :
common_answers_wide <- df_longer %>%
group_by(id, time, w, t) %>%
mutate(
# retain t only when the response has been given by >1 subject
t = case_when(
w == 0 ~ "0",
n() > 1 ~ t,
T ~ "0"
)
) %>%
ungroup() %>%
select(-w) %>%
pivot_wider(
names_from = time, names_prefix = "t", names_sort = T,
values_from = t
)
这将为您提供所需的输出:
> common_answers_wide
# A tibble: 6 x 5
id pnum t1 t2 t3
<dbl> <dbl> <chr> <chr> <chr>
1 1 1 0 0 0
2 1 2 0 0 w
3 1 3 0 0 w
4 2 1 0 0 0
5 2 2 s 0 s
6 2 3 s 0 s
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句