我有以下数据集:
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")
答案 0 :(得分:1)
我不明白为什么在您的预期输出中[id1, pnum3, t2]
处有一个“ s”-除此之外,我认为以下内容可能会对您有所帮助:
首先,将数据旋转为“较长”格式,可以按时间分组,可以帮助您通用化代码。
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