一起使用 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)
你可以这样做:
- 我把第一个 table 读成了“acc”
- 我已将最后一个 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,希望你能用上。
提前道歉,这个问题很大 - 我试图包含尽可能多的细节。下面的示例 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)
你可以这样做:
- 我把第一个 table 读成了“acc”
- 我已将最后一个 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,希望你能用上。