如何匹配两个数据帧的字符值并在 R 中应用与此匹配相对应的函数?

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   \n
Run 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\n
Run 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
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
象征计算
A26
公元前7
数,A10
\n
\n

我如何在 R 中执行此操作(使用 dplyr)?

\n

Ony*_*mbu 5

df1 %>%\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\n
Run Code Online (Sandbox Code Playgroud)\n