根据条件选择值

学生

我有以下数据集:

 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在时间tw

换句话说idpnum定义进行测量的不同个人。在某些情况下,测量是一起进行的,而在其他情况下,测量是单独进行的。如果把它们放在一起比'w'我们拥有价值1

For example: 

Common activities at time t:

Id 1 pnum 1t1(例如1)的报道中,该组进行了测量,更具体地说是使用id1/pnum3如果两个组的测量数据共同使用,我想保存它。

Uncommon  activities at time t:

Id 2 pnum 1在t1处报道的(例如1),一个测量是与来自基团,更具体地id2/pnum2,并pnum 3.在这种情况下一起测量数据之间罕见id2/pnum1pnum 2作为阱之间id2/pnum1pnum 3我不想保存这些度量。但是,我想保存之间的一个共同的报告id2/pnum2pnum 3.

Generic example id 1:

在ID为1的组中,t1处的pnum1和pnum3进行了测量。Pnum 1报道wpnum 2pnum 3报道o这意味着pnum 2pnum 3报告的测量结果相同。但是,当我看着W1我可以观察到,他们不在一起的时候,他们就照在w1 pnum 20pnum 31换句话说,即使度量是通用的,pnum 2并且pnum 3由于它们没有被合并在一起,所以我也不想保存这种情况。我需要报告他们是否报告了相同的测量结果。在这种情况下,pnum1在报告wpnum 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")
                                                                               
alex_jwb90

我不明白为什么在您的预期输出中有一个“ 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章