![](/img/trans.png)
[英]Add a column based on the values of other two columns in the same data frame in r
[英]Add a calculated column based on same and two other columns in r
我正在嘗試添加一個基於相同值的計算列和根據第三列中的值計算的另一列。 有三列, year , id和value 。 如果2011年的ID為2005的ID相匹配,然后從2011年等方面差異顯示10-11 = -1,20-5 = 15,和30-16 = 14的值中減去2005的價值...和剩余的行可以是 0 或 NA,沒關系。 下表顯示了帶有新差異列的結果表。
我知道我可以將數據分成兩個表,然后如果兩個表按年份和 ID 排序相同,則通過簡單的減法創建列,但這不是這個特定問題的選項。 嘗試考慮如何使用 case_when 或 ifelse 但它令人費解,無法理解。 我發現了一些例子,但它們沒有解決這個問題——它們主要基於僅使用兩列或三列之間的比較……不過,這里的一個值來自同一列。 我該如何解決這個問題?
非常感謝您的幫助。
這是原始表的代碼:
dat <- data.frame(year=c(2011,2011,2011,2005,2005,2005),
id=c(1,2,3,1,2,3),
value=c(10,20,30,11,5,6))
對於在對 Ronak 的回答的評論中有多個 id 的情況,您可以執行以下操作:
library(tidyr)
library(dplyr)
dat2 |>
pivot_wider(id, values_from = value, names_from = year) |>
unnest(c(`2011`, `2005`)) |>
mutate(difference = `2011` - `2005`) |>
pivot_longer(c(`2011`, `2005`), names_to = "year")
# A tibble: 10 x 4
id difference year value
<dbl> <dbl> <chr> <dbl>
1 1 -1 2011 10
2 1 -1 2005 11
3 1 -1 2011 10
4 1 -1 2005 11
5 2 15 2011 20
6 2 15 2005 5
7 2 15 2011 20
8 2 15 2005 5
9 3 24 2011 30
10 3 24 2005 6
根據year
值的降序排列數據,並為每個id
減去當前值與下一個值。
library(dplyr)
dat %>%
arrange(desc(year)) %>%
group_by(id) %>%
mutate(difference = value - lead(value)) %>%
#to get 0 instead of NA use the below one
#mutate(difference = value - lead(value, default = last(value))) %>%
ungroup
# year id value difference
# <dbl> <dbl> <dbl> <dbl>
#1 2011 1 10 -1
#2 2011 2 20 15
#3 2011 3 30 24
#4 2005 1 11 NA
#5 2005 2 5 NA
#6 2005 3 6 NA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.