如何在R中的同一项目内跨多行过滤

slwdgvem  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(114)

我有以下结构的数据:
| 参与者|项目|区域|观察|实时|
| - ------| - ------| - ------| - ------| - ------|
| 第1页|项目1|区域1| 1个|小行星3300|
| 第1页|项目1|区域2|无|不适用|
| 第1页|项目1|区域3|无|不适用|
| 第1页|项目2|区域1| 1个|五千|
| 第1页|项目2|区域2|无|不适用|
| 第1页|项目2|区域3| 1个|七千|
我有一组参与者对一系列项目做出响应。对于每个项目,每个参与者有三行,每行对应于项目的不同区域。观察表示参与者是否查看了该区域(0-否,1-是)我希望仅在存在区域1和区域3的观测值的情况下执行查看区域3的RT的分析,但没有对区域2的观察。因此,在上面的示例中,将不包括项目1的区域3,但将包括项目2的区域3。
到目前为止,我所做的所有尝试都未能成功地说明项目的值。我可以创建一个代码,以确定每个区域是否有观测,但一旦我只选择区域3进行分析,我就无法说明每个项目在区域1和2中的值(最终没有有效的观测)。
我试过按项目对数据进行分组,但我真的不知道该怎么办。
我的数据:

structure(list(Participant = c("p1", "p1", "p1", "p1", "p1", 
"p1"), Item = c("Item 1", "Item 1", "Item 1", "Item 2", "Item 2", 
"Item 2"), Region = c("Region 1", "Region 2", "Region 3", 
"Region 1", "Region 2", "Region 3"), Observation = c(1, 0, 
0, 1, 0, 1), RT = c(3300L, NA, NA, 5000L, NA, 7000L)), class = "data.frame", row.names = c(NA, 
-6L))
c0vxltue

c0vxltue1#

未将NA更改为0的替代版本:

df <- structure(list(Participant = c("p1", "p1", "p1", "p1", "p1", 
                               "p1"), Item = c("Item 1", "Item 1", "Item 1", "Item 2", "Item 2", 
                                                "Item 2"), Region = c("Region 1", "Region 2", "Region 3", 
                                                                      "Region 1", "Region 2", "Region 3"), Observation = c(1, 0, 
                                                                                                                           0, 1, 0, 1), RT = c(3300L, NA, NA, 5000L, NA, 7000L)), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                                      -6L))

df |>
  # subset only with needed data
  dplyr::select(-RT) |>
  tidyr::pivot_wider(names_from = Region, 
                     values_from = Observation) |>
  # filter
  dplyr::filter(`Region 1` == 1 & `Region 2` == 0 & `Region 3` == 1) |>
  dplyr::select(Participant, Item, `Region 3`) |>
  # back to original format
  tidyr::pivot_longer(`Region 3`, names_to = "Region", values_to = "Observation") |>
  dplyr::left_join(df)
#> Joining, by = c("Participant", "Item", "Region", "Observation")
#> # A tibble: 1 × 5
#>   Participant Item   Region   Observation    RT
#>   <chr>       <chr>  <chr>          <dbl> <int>
#> 1 p1          Item 2 Region 3           1  7000

创建于2022年12月16日,使用reprex v2.0.2

brgchamk

brgchamk2#

您可以删除NA(或过滤0或1)并按组过滤:

library(dplyr)

df |>
  na.omit() |>
  group_by(Item) |>
  filter(all(c("Region1", "Region3") %in% Region),
         Region == "Region3") |>
  ungroup()

输出:

# A tibble: 1 × 5
  Participant Item  Region  Observation    RT
  <chr>       <chr> <chr>         <dbl> <dbl>
2 p1          Item2 Region3           1  7000

数据:

library(readr)

df <- read_table("Participant   Item    Region  Observation RT
p1  Item1   Region1 1   3300
p1  Item1   Region2 0   NA
p1  Item1   Region3 0   NA
p1  Item3   Region1 0   NA
p1  Item3   Region2 0   NA
p1  Item3   Region3 1   3300
p1  Item2   Region1 1   5000
p1  Item2   Region2 0   NA
p1  Item2   Region3 1   7000")

相关问题