Hom*_*son 3 r match conditional-statements dataframe dplyr
我有两个数据框,如下所示:
\n\nlibrary(tidyverse)\ndate = c(rep(as.Date("2022-01-01"),4),rep(as.Date("2022-02-01"),4),rep(as.Date("2022-03-01"),3))\nA = seq(1,11,1)\nB = seq(12,22,1)\nC = seq(23,33,1)\nsymbol = c(rep("A",4),rep("B,C",4),rep("D,A",3))\ndf1 = tibble(date,A,B,C,symbol);df1\n# A tibble: 11 \xc3\x97 5\n date A B C symbol\n <date> <dbl> <dbl> <dbl> <chr> \n 1 2022-01-01 1 12 23 A \n 2 2022-01-01 2 13 24 A \n 3 2022-01-01 3 14 25 A \n 4 2022-01-01 4 15 26 A \n 5 2022-02-01 5 16 27 B,C \n 6 2022-02-01 6 17 28 B,C \n 7 2022-02-01 7 18 29 B,C \n 8 2022-02-01 8 19 30 B,C \n 9 2022-03-01 9 20 31 D,A \n10 2022-03-01 10 21 32 D,A \n11 2022-03-01 11 22 33 D,A \nRun Code Online (Sandbox Code Playgroud)\n第二个:
\n\nfirst = c("A","A","B","B","B")\nsecond = c("D","F","A","C","D")\nvalue = c(2,3,4,3,5)\ndf2 = tibble(first,second,value);df2\n# A tibble: 5 \xc3\x97 3\n first second value\n <chr> <chr> <dbl>\n1 A D 2\n2 A F 3\n3 B A 4\n4 B C 3\n5 B D 5\nRun Code Online (Sandbox Code Playgroud)\n我想从第一个数据帧中搜索数据帧 2 (df2) 的第一列和第二列中的列符号的值。如果 df1 中的符号没有对来取 df1 中 A、B、C 列子矩阵的最大值即 26。
\n如果存在一对匹配,例如 df1 和 df2 中的 B、C 则取 df1 中 df2 的值对应的行的最小值。在我的示例中,列符号中的 B、C 存在于 df2 中,因此值为 3 df1 中 B,C 对应的子矩阵第三行为 7,18,29,最小值为 7。对于 D,AI 必须取 df1 中 D,A 子矩阵第 2 行中的最小值,即10、21、32,最少 10 个。
\n最后我希望理想情况下报告的数据框是这样的:
\n| 象征 | 计算 |
|---|---|
| A | 26 |
| 公元前 | 7 |
| 数,A | 10 |
我如何在 R 中执行此操作(使用 dplyr)?
\ndf1 %>%\n separate(symbol, c("first", "second"), fill = "right", remove = FALSE)%>%\n left_join(rbind(df2, transform(df2, first = second, second = first)))%>%\n group_by(symbol)%>%\n summarise(calc = if(is.na(value[1])) max(c_across(A:C)) \n else pmin(c_across(A:C))[value[1]])\n \n# A tibble: 3 \xc3\x97 2\n symbol calc\n <chr> <dbl>\n1 A 26\n2 B,C 7\n3 D,A 10\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
412 次 |
| 最近记录: |