根据条件选择值

时间:2020-09-11 05:13:49

标签: r dataframe

我有以下数据集:

 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,我想确定在时间commonpnum 3t相关的w报告的测量值。

换句话说,idpnum定义了进行某些测量的不同个人。在某些情况下,测量是一起进行的,而在其他情况下,测量是单独进行的。如果与'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/pnum2pnum 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时,我发现它们在w1pnum 20,而pnum 31时它们并不在一起。换句话说,尽管pnum 2pnum 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")
                                                                               

1 个答案:

答案 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
相关问题