繁体   English   中英

Tidyverse:将两个 data.frames 中的数字列相乘

[英]Tidyverse: Multiply numeric columns from two data.frames

我有一个 Quantities 和其他 Weights 的data.frame ,我想将 Quantities 与其相应的 Weights 相乘。 是否可以通过仅选择数字列来完成任务? 但是,我也想保留最终 output 中的其他列。 苦苦挣扎如何更有效地获得它。

library(tidyverse)

df1 <-
  tibble(
    "A" = paste0("A", 1:10)
  , "Q" = 1:10
    )

df1
#> # A tibble: 10 x 2
#>    A         Q
#>    <chr> <int>
#>  1 A1        1
#>  2 A2        2
#>  3 A3        3
#>  4 A4        4
#>  5 A5        5
#>  6 A6        6
#>  7 A7        7
#>  8 A8        8
#>  9 A9        9
#> 10 A10      10

df2 <-
  tibble(
    "A" = paste0("A", 1:10)
  , "W" = 11:20
    )

df2
#> # A tibble: 10 x 2
#>    A         W
#>    <chr> <int>
#>  1 A1       11
#>  2 A2       12
#>  3 A3       13
#>  4 A4       14
#>  5 A5       15
#>  6 A6       16
#>  7 A7       17
#>  8 A8       18
#>  9 A9       19
#> 10 A10      20

select(df1, -A) * select(df2, -A)
#>      Q
#> 1   11
#> 2   24
#> 3   39
#> 4   56
#> 5   75
#> 6   96
#> 7  119
#> 8  144
#> 9  171
#> 10 200

df1*df2
#> Error in FUN(left, right): non-numeric argument to binary operator

已编辑

我的真实数据集有很多列,因此正在寻找更通用的解决方案。

library(tidyverse)

df1 <-
  tibble(
    "A" = paste0("A", 1:10)
    , "Q" = 1:10
  )

df2 <-
  tibble(
    "A" = paste0("A", 1:10)
    , "W" = 11:20
  )

df1 |>
  mutate(Q*df2$W)
#> # A tibble: 10 x 3
#>    A         Q `Q * df2$W`
#>    <chr> <int>       <int>
#>  1 A1        1          11
#>  2 A2        2          24
#>  3 A3        3          39
#>  4 A4        4          56
#>  5 A5        5          75
#>  6 A6        6          96
#>  7 A7        7         119
#>  8 A8        8         144
#>  9 A9        9         171
#> 10 A10      10         200

reprex package (v2.0.1) 创建于 2022-02-25

如果df1$A == df2$A那么你也可以使用left_join和 mutate。

使用基数R

data.frame(A = df1$A, variable = df1$Q * df2$W)

     A variable
1   A1       11
2   A2       24
3   A3       39
4   A4       56
5   A5       75
6   A6       96
7   A7      119
8   A8      144
9   A9      171
10 A10      200

使用dplyr

library(dplyr)
mutate(df1, variable = Q * df2$W) %>% select(-Q) # select(-Q) removes the old Q variable

# A tibble: 10 x 2
   A     variable
   <chr>    <int>
 1 A1          11
 2 A2          24
 3 A3          39
 4 A4          56
 5 A5          75
 6 A6          96
 7 A7         119
 8 A8         144
 9 A9         171
10 A10        200

如果您想保留最终产品中的所有列,您可以执行以下操作:

library(dplyr)
left_join(df1, df2, by = "A") %>% 
        mutate(variable = Q * W)

# A tibble: 10 x 4
   A         Q     W variable
   <chr> <int> <int>    <int>
 1 A1        1    11       11
 2 A2        2    12       24
 3 A3        3    13       39
 4 A4        4    14       56
 5 A5        5    15       75
 6 A6        6    16       96
 7 A7        7    17      119
 8 A8        8    18      144
 9 A9        9    19      171
10 A10      10    20      200

另一种可能的解决方案,使用inner_join

library(tidyverse)

df1 <-
  tibble(
    "A" = paste0("A", 1:10)
    , "Q" = 1:10
  )

df2 <-
  tibble(
    "A" = paste0("A", 1:10)
    , "W" = 11:20
  )

df1  %>% 
  inner_join(df2) %>% 
  mutate(T = Q*W)
#> Joining, by = "A"
#> # A tibble: 10 × 4
#>    A         Q     W     T
#>    <chr> <int> <int> <int>
#>  1 A1        1    11    11
#>  2 A2        2    12    24
#>  3 A3        3    13    39
#>  4 A4        4    14    56
#>  5 A5        5    15    75
#>  6 A6        6    16    96
#>  7 A7        7    17   119
#>  8 A8        8    18   144
#>  9 A9        9    19   171
#> 10 A10      10    20   200

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM