簡體   English   中英

將 dataframe 中的列乘以另一個 dataframe 中給出的值

[英]Multiply columns in dataframe by values given in another dataframe

我一直在嘗試在 dplyr 中完成此操作,但無法弄清楚。

在一個數據框 (df1) 中,我有包含值的列。

|A  |B  |
|23 |43 |
|24 |11 |

在另一個數據框 (df2) 中,我有 valus。

|Column|Value|
|A     |0.12 |
|B     |1.23 |

我想以某種方式將 df1 的“A”列中的每個單元格乘以 df2 中該列的給定值。 看起來應該是微不足道的,但我還沒有完全弄清楚正確的語法。 我懷疑我使用的是 mutate,但如有任何建議,我們將不勝感激。

主要是嘗試在 dplyr 中完成此操作,但歡迎提出其他建議。

您可以使用mutate(across()) ,並利用cur_column()對第二個數據框進行子集化

mutate(d1, across(A:B, ~.x*d2[d2$Column==cur_column(),2]))

Output

      A     B
  <dbl> <dbl>
1  2.76  52.9
2  2.88  13.5

輸入:

d1 = data.frame(A = c(23,24), B=c(43,11))
d2 = data.frame(Column = c("A","B"), Value = c(.12,1.23))

這可以擴展到任意數量的列; 這是一個包含三列的輸入,A、B、C。

d1 = data.frame(A = c(23,24), B=c(43,11), C=c(25,16))
d2 = data.frame(Column = c("A","B", "C"), Value = c(.12,1.23, 0.75))

mutate(d1, across(where(is.numeric), ~.x*d2[d2$Column==cur_column(),2]))


     A     B     C
1 2.76 52.89 18.75
2 2.88 13.53 12.00

有一種更冗長的方法,其中 d1 旋轉更長並連接到 d2,計算完成,結果 pivoted_wider。 它提供相同的 output:

inner_join(d2, pivot_longer(d1,everything(), names_to = "Column", values_to = "value")) %>% 
  mutate(value = Value*value) %>%
  select(-Value) %>% 
  pivot_wider(names_from=Column, values_from = value, values_fn=list) %>% 
  unnest(everything())

Output:

      A     B     C
  <dbl> <dbl> <dbl>
1  2.76  52.9  18.8
2  2.88  13.5  12  

將 d1 列 A 中的值乘以 d2 中的值,其中列為 A:

library(dplyr)

d1 %>% 
  mutate(A = A * d2$Value[d2$Column=="A"])
     A  B
1 2.76 43
2 2.88 11

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM