假設我們執行left_join()如下所示的一系列資料幀(請不要擔心 的適當性left_join(),這是一個從較大的代碼中提取的簡單示例,它確實需要left_join()):
library(dplyr)
mydat <- data.frame(period = c(1, 2, 3, 4, 5, 6, 7, 8), plusA = c(10,20,12,13,17,19,20,16))
minus_B <- data.frame(period = c(1, 2, 3, 4, 5, 6, 7, 8), minusB = c(8,18,10,11,18,9,12,4))
equals_D <- data.frame(period = c(1, 2, 3, 4, 5, 6, 7, 8), equalsD = c(18,28,20,21,28,19,22,14))
mydat %>%
left_join(minus_B) %>%
left_join(equals_D)
period plusA minusB equalsD
1 1 10 8 18
2 2 20 18 28
3 3 12 10 20
4 4 13 11 21
5 5 17 18 28
6 6 19 9 19
7 7 20 12 22
8 8 16 4 14
我正在嘗試在“minusB”和“equalsD”列之間添加一個名為“adjC”的平衡列,這將留下一個資料框輸出:
period plusA minusB adjC equalsD [Explain column adjC]
1 1 10 8 16 18 18 - (10 - 8) = 16
2 2 20 18 26 28 28 - (20 - 18) = 26
3 3 12 10 18 20 etc.
4 4 13 11 19 21
5 5 17 18 27 28
6 6 19 9 9 19
7 7 20 12 16 22
8 8 16 4 2 14
我一直在胡鬧mydat %>% mutate(adjust_C = equalsD - (plusA - minusB)),或者把它插入到上述left_join()系列的中間,它不起作用。
任何想法如何做到這一點?我也在嘗試堅持使用 dplyr。
uj5u.com熱心網友回復:
問題是 OPmutate直接用于未更新的原始資料集
library(dplyr)
mydat %>%
left_join(minus_B) %>%
left_join(equals_D) %>%
mutate(adjC = equalsD - (plusA - minusB), .before = 'equalsD')
-輸出
period plusA minusB adjC equalsD
1 1 10 8 16 18
2 2 20 18 26 28
3 3 12 10 18 20
4 4 13 11 19 21
5 5 17 18 29 28
6 6 19 9 9 19
7 7 20 12 14 22
8 8 16 4 2 14
uj5u.com熱心網友回復:
不確定您是否同時尋找adjC和explain_adjC?:
library(dplyr)
mydat %>%
left_join(minus_B) %>%
left_join(equals_D) %>%
mutate(adjC = equalsD - (plusA - minusB),
.before = "equalsD") %>%
mutate(explain_adjC = paste0(equalsD, ' - (', plusA, ' - ', minusB, ') = ', adjC)
# alternatively with {glue}:
# mutate(explain_adjC = glue::glue("{equalsD} - ({plusA} - {minusB}) = {adjC}"))
)
#> Joining, by = "period"
#> Joining, by = "period"
#> period plusA minusB adjC equalsD explain_adjC
#> 1 1 10 8 16 18 18 - (10 - 8) = 16
#> 2 2 20 18 26 28 28 - (20 - 18) = 26
#> 3 3 12 10 18 20 20 - (12 - 10) = 18
#> 4 4 13 11 19 21 21 - (13 - 11) = 19
#> 5 5 17 18 29 28 28 - (17 - 18) = 29
#> 6 6 19 9 9 19 19 - (19 - 9) = 9
#> 7 7 20 12 14 22 22 - (20 - 12) = 14
#> 8 8 16 4 2 14 14 - (16 - 4) = 2
# data
mydat <- data.frame(period = c(1, 2, 3, 4, 5, 6, 7, 8), plusA = c(10,20,12,13,17,19,20,16))
minus_B <- data.frame(period = c(1, 2, 3, 4, 5, 6, 7, 8), minusB = c(8,18,10,11,18,9,12,4))
equals_D <- data.frame(period = c(1, 2, 3, 4, 5, 6, 7, 8), equalsD = c(18,28,20,21,28,19,22,14))
由reprex 包于 2022-01-10 創建(v2.0.1)
uj5u.com熱心網友回復:
誠然,這是一種蠻力解決方案,但為什么不在加入后使用基本 R 語法呢?我認為這種行為是加入的神器dplyr::。只需將您的連接設為資料框,然后創建一個新列。請記住,R 并不真正關心資料結構的列順序,因此您可以根據需要簡單地重新排序列。這是一個可重現的示例:
library(dplyr)
mydat <- data.frame(period = c(1, 2, 3, 4, 5, 6, 7, 8), plusA = c(10,20,12,13,17,19,20,16))
minus_B <- data.frame(period = c(1, 2, 3, 4, 5, 6, 7, 8), minusB = c(8,18,10,11,18,9,12,4))
equals_D <- data.frame(period = c(1, 2, 3, 4, 5, 6, 7, 8), equalsD = c(18,28,20,21,28,19,22,14))
JOINED<-data.frame(mydat %>%
left_join(minus_B) %>%
left_join(equals_D))
JOINED[,"adj_C"] <- (JOINED$equalsD - (JOINED$plusA - JOINED$minusB))
out<-JOINED[,c(1:3, 5, 4)]
out
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/408950.html
標籤:
