Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套循环和多if语句R_R_If Statement_For Loop_Dplyr - Fatal编程技术网

嵌套循环和多if语句R

嵌套循环和多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

我有一个数据集a,如下所示

       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