嵌套循环和多if语句R
我有一个数据集a,如下所示嵌套循环和多if语句R,r,if-statement,for-loop,dplyr,R,If Statement,For Loop,Dplyr,我有一个数据集a,如下所示 Dictionary ActMin ActMax 3145 5 10 32441 10 19 3245 25 32 416356 37 46 4H22 82 130 %ABC
Dictionary ActMin ActMax
3145 5 10
32441 10 19
3245 25 32
416356 37 46
4H22 82 130
%ABC 1 27
ID Test Obs Year
1 3145-MN 11 1994
2 3145-NY 17 1992
1 416356-FL 57 1995
1 32441-MN 13 1995
2 3145-MN 8 1993
2 3245-NY 27 1983
3 3245-FL 45 2003
2 3145-MN 6 2001
3 %ABC-NY 33 1996
4 4H22-TX 97 1984
我有另一个数据集b,如下所示
Dictionary ActMin ActMax
3145 5 10
32441 10 19
3245 25 32
416356 37 46
4H22 82 130
%ABC 1 27
ID Test Obs Year
1 3145-MN 11 1994
2 3145-NY 17 1992
1 416356-FL 57 1995
1 32441-MN 13 1995
2 3145-MN 8 1993
2 3245-NY 27 1983
3 3245-FL 45 2003
2 3145-MN 6 2001
3 %ABC-NY 33 1996
4 4H22-TX 97 1984
我想做的是产生这样的输出
Id Test Obs Results Year Description
1 3145-MN 11 High 1994 Tested 3145 High on 1994, 4163 High on 1995,
2 3145-NY 17 High 1992 Tested 3145 High on 1992
1 416356-FL 57 High 1995
1 32441-MN 13 Normal 1995
2 3145-MN 8 Normal 1993
2 3245-NY 27 Normal 1983
3 3245-FL 45 High 2003 Tested 3245 High on 2003
2 3145-MN 6 Normal 2001
3 %ABC-NY 33 High 1996
4 4H22-TX 27 Normal 1984
第一个数据集a是一个存储唯一测试编号3145、3244等及其最小值和最大值的字典
第二个数据集b是存储实际观察结果的实际测试结果数据集。将b中特定测试的观察值与数据集a中的最小值和最大值进行比较。如果b中的观察值大于a中的实际最小值和最大值,则结果列应更新为高,否则为正常。“说明”列应提供每个ID的测试摘要,每个ID的测试摘要都列在较高的位置
需要有关此复杂循环、if语句和结果聚合的帮助。有点复杂,但结果应该与您要求的类似。我设法以R为底获得结果列,但为了描述,我必须使用data.table
通过使用dplyr,可以发现代码更具可读性:
library(dplyr)
df_result <-
b %>%
## EDIT mutate( Dictionary = as.numeric(substring(Test,1,4)) ) %>%
mutate( Dictionary = as.numeric( gsub("[A-Z,-]+", "", Test )) ) %>%
inner_join(a, by = "Dictionary") %>%
mutate( Results = ifelse( Obs > pmax(ActMin, ActMax), yes = "High", no = "Normal" ))
df_description <-
df_result %>%
filter( Results == "High") %>%
group_by(ID) %>%
summarise(
Results = Results[1],
Dictionary = min(Dictionary),
Description = paste("Tested", Dictionary, "on", Year,collapse = ","))
df_final <-
df_result %>%
left_join( df_description, by = c("ID","Dictionary", "Results")) %>%
select(ID, Test, Obs, Results, Year, Description)
您使用了substringTest,1,4来捕获b中匹配的测试代码,但是测试代码的字符串长度不同—有些可能是3145,有些可能是416356,我在前面的问题中没有提到这一点—我只是更新了我的问题。我应该如何更改这部分代码以适应不同的测试代码Id长度?用gsub替换子字符串-例如as.numeric gsub[A-Z,-]+,test有一些奇怪的测试代码,如…4H22,%ABC I替换了as.numeric gsub[A-Z,…使用此代码sub-.+,,b$TEST,现在我遇到一个错误….无法在列上连接…索引超出边界删除b$,并检查是否应将测试重命名为sub-.+,,b$TEST中的测试类似于我对bergant提到的您使用substrb$TEST,1,4测试代码的长度可能并不总是4