簡體   English   中英

用數據框中每 5 行的第一行減去一列

[英]Subtracting one column by another by the first row in every 5 rows in dataframe

假設我有一個數據框 df,這樣:

set.seed(123)
df1 <- 0
df1$visit <- rep(c("scr", "1mo", "3mo", "6mo0", "12mo", "2yr"), 2)
df1 <- as.data.frame(df1)
df1$id <- rep(c("101","102"), each = 6)
df1 <- df1[ ,-c(1)]
df1$x <- sample(0:30, 12, replace = T)

df1$want = c(0, -16, -12, -17, -28, -21, 0, 4, -7, -13, 2, -4)

我想做的是:減去篩選行(可以是負數)之后的每一行(X 值) 僅從篩選訪問中創建更改變量。 所以它本質上是循環遍歷集合來計算篩選訪問的變化,然后對每個 ID/訪問集重復這個過程(這個虛擬集基本上有兩個 ID)。

我試過:在這里尋找類似的答案,我能得到的最接近的是使用 dplyr 中的 mutate()。 我找到的所有答案要么告訴我如何減去滯后行或前導行,要么在某些條件匹配時發生變異。

也許我可以在 excel 中做到這一點,但我會在未來的分析中經常重復使用它。

編輯:添加了完全正確值的變量。

這會起作用,我們只需id分組,然后利用first()函數來獲取每個組的 x 與第一個值的差異。

library(tidyverse)

df1 %>% group_by(id) %>% mutate(new = x - first(x))

# A tibble: 12 x 5
# Groups:   id [2]
   visit id        x  want   new
   <fct> <chr> <int> <dbl> <int>
 1 scr   101      30     0     0
 2 1mo   101      14   -16   -16
 3 3mo   101      18   -12   -12
 4 6mo0  101      13   -17   -17
 5 12mo  101       2   -28   -28
 6 2yr   101       9   -21   -21
 7 scr   102      17     0     0
 8 1mo   102      21     4     4
 9 3mo   102      10    -7    -7
10 6mo0  102       4   -13   -13
11 12mo  102      19     2     2
12 2yr   102      13    -4    -4

暫無
暫無

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

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