一起使用 case_when 和 lag()?

Using case_when and lag() together?

提前道歉,这个问题很大 - 我试图包含尽可能多的细节。下面的示例 table 是行为任务的输出。在 448 次试验中的每一次试验中,在每次试验的开始和结束时都有视觉蒙版,一个视觉素数(六个可能的素数,由代码 1:6 表示),以及一个做出反应的目标(六个可能的, 由代码 7:12) 表示。目标的准确度用 1(正确)或 0(不正确)表示。

我现在需要向响应行添加新代码。这些新闻代码必须是代表目标类型和准确性的每种组合的新数字。例如,如果有一个方形目标(代码 12),并且参与者是正确的(准确度 = 1),则新代码将为 25;如果有一个正方形目标 (12) 而它们不正确 (Accuracy=0),则新代码将为 26,对于目标 (7:12) 和准确度 (0:1) (12) 的每个组合,依此类推组合总计)。

Trial Label Code Accuracy
1 Pre-Mask 13 1
1 BluePrime 6 1
1 SqureTarget 12 1
1 Post-Mask 14 1
1 Response NA 1
2 Pre-Mask 13 0
2 RedPrime 4 0
2 CircleTarget 9 0
2 Post-Mask 14 0
2 Response NA 0

基本上,我需要一个条件语句来替换 NA,该语句基于缺失值之前两行的两个不同列的信息。输出应如下所示:

Trial Label Code Accuracy
1 Pre-Mask 13 1
1 BluePrime 6 1
1 SqureTarget 12 1
1 Post-Mask 14 1
1 Response 25 1
2 Pre-Mask 13 0
2 RedPrime 4 0
2 CircleTarget 9 0
2 Post-Mask 14 0
2 Response 20 0

这是 table 所有可能的新组合:

When target is.. And Accuracy is... New Code #
7 1 15
7 0 16
8 1 17
8 0 18
9 1 19
9 0 20
10 1 21
10 0 22
11 1 23
11 0 24
12 1 25
12 0 26

我尝试了 lag() 和 case_when() 的不同组合,但是当我开始输入时,我意识到我真的不知道如何构建论点(我对R 和一般编程)。我知道我可以在 Excel 中手动输入数字,但我希望在 R 中将其在某种程度上自动化。我意识到这些信息也可以很容易地放入一个新行中,但为了我用来理解代码值的下一个程序,它们都需要按照它们实时出现的顺序位于同一列中(响应输入将始终遵循 post-视觉掩码,代码 14 ).

如果需要任何说明,请告诉我。感谢您的帮助!

我认为这符合您的逻辑:

library(dplyr)
library(tidyr)

input %>%
  ## join the new values to the original data on their current rows
  left_join(lookup, by = c("Code", "Accuracy")) %>%
  ## do all subsequent operations within each Trial group
  group_by(Trial) %>%
  ## Fill in missing `New_Code` values based on the previous non-missing value
  fill(New_Code, .direction = "down") %>%
  ## replace any `Code` missing values with the `New_Code` value
  mutate(Code = coalesce(Code, New_Code))

# # A tibble: 10 x 5
# # Groups:   Trial [2]
# Trial Label         Code Accuracy New_Code
# <int> <chr>        <int>    <int>    <int>
#  1     1 Pre-Mask        13        1       NA
#  2     1 BluePrime        6        1       NA
#  3     1 SqureTarget     12        1       25
#  4     1 Post-Mask       14        1       25
#  5     1 Response        25        1       25
#  6     2 Pre-Mask        13        0       NA
#  7     2 RedPrime         4        0       NA
#  8     2 CircleTarget     9        0       20
#  9     2 Post-Mask       14        0       20
# 10     2 Response        20        0       20

当然,您可以通过添加 ... %>% select(-New_Code) 来删除 New_Code 列——为了清楚起见,我将其留在上面。


使用此数据:

input = read.table(text = 'Trial    Label   Code    Accuracy
1   Pre-Mask    13  1
1   BluePrime   6   1
1   SqureTarget 12  1
1   Post-Mask   14  1
1   Response    NA  1
2   Pre-Mask    13  0
2   RedPrime    4   0
2   CircleTarget    9   0
2   Post-Mask   14  0
2   Response    NA  0', header = T)

lookup = read.table(text = 'Code    Accuracy    New_Code
7   1   15
7   0   16
8   1   17
8   0   18
9   1   19
9   0   20
10  1   21
10  0   22
11  1   23
11  0   24
12  1   25
12  0   26', header = TRUE)

你可以这样做:

  1. 我把第一个 table 读成了“acc”
  2. 我已将最后一个 table 读为“目标”
merge <- merge(x = acc, y = target, by = c("Code", "Accuracy"), all.x= TRUE)
   Code Accuracy Trial        Label newCode
1     4        0     2     RedPrime      NA
2     6        1     1    BluePrime      NA
3     9        0     2 CircleTarget      20
4    12        1     1  SqureTarget      25
5    13        0     2     Pre-Mask      NA
6    13        1     1     Pre-Mask      NA
7    14        0     2    Post-Mask      NA
8    14        1     1    Post-Mask      NA
9    NA        0     2     Response      NA
10   NA        1     1     Response      NA

newCodes <- merge[!is.na(merge$newCode),c("Trial", "newCode")]
merge <- merge(merge, newCodes, "Trial")  

  Trial Code Accuracy        Label newCode.x newCode.y
1      1    6        1    BluePrime        NA        25
2      1   12        1  SqureTarget        25        25
3      1   13        1     Pre-Mask        NA        25
4      1   14        1    Post-Mask        NA        25
5      1   NA        1     Response        NA        25
6      2    4        0     RedPrime        NA        20
7      2    9        0 CircleTarget        20        20
8      2   13        0     Pre-Mask        NA        20
9      2   14        0    Post-Mask        NA        20
10     2   NA        0     Response        NA        20

merge[merge$Label =='Response',]$Code <- merge[merge$Label =='Response',]$newCode.y

   Trial Code Accuracy        Label newCode.x newCode.y
1      1    6        1    BluePrime        NA        25
2      1   12        1  SqureTarget        25        25
3      1   13        1     Pre-Mask        NA        25
4      1   14        1    Post-Mask        NA        25
5      1   25        1     Response        NA        25
6      2    4        0     RedPrime        NA        20
7      2    9        0 CircleTarget        20        20
8      2   13        0     Pre-Mask        NA        20
9      2   14        0    Post-Mask        NA        20
10     2   20        0     Response        NA        20

抱歉没有用到case when,希望你能用上。