簡體   English   中英

在 r 中添加基於相同和其他兩列的計算列

[英]Add a calculated column based on same and two other columns in r

我正在嘗試添加一個基於相同值的計算列和根據第三列中的值計算的另一列。 有三列, yearidvalue 如果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.

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