![](/img/trans.png)
[英]How to update data from column i row 2 to column j row 1 in R dataframe?
[英]How to update data from column i row 2 to column j row 1 but grouped by two variables (dplyr) in a R dataframe?
我有兩列:站點(3 個站點)和月份(1 月 - 3 月),我每個月都在其中采樣。 對於每個月,我在 i 列中都有相應的值。 我想將第 i 列第 2 行復制到第 j 行第 1 行。然后分配第 j 行第 3 列第 i 行第 1 列。對每個站點的行的 rest 重復此模式。 所以,如果第 i 列從 1 變為 18。第 j 列將 go 從 2 3 1 5 6 4 8 9 7 11 12 10 14 15 13 17 18 13。我試圖從我得到的類似問題的答案中修改代碼這里使用 dplyr。 我嘗試在 dplyr 中使用 group_by function 以便它再次循環返回,但 function 正在整個列上運行。
library(dplyr)
col.site <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6)
col.month <- c("Jan","Feb","Mar","Jan","Feb","Mar","Jan","Feb","Mar","Jan","Feb","Mar","Jan","Feb","Mar","Jan","Feb","Mar")
col.i <- c(1:18)
df <- data.frame(col.site,col.month, col.i)
df <- df %>% group_by(col.month,col.site) %>%
mutate(col.j = lead(col.i, default = col.i[1]))
col.j
[1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1
What I expected col.j:
[1] 2 3 1 5 6 4 8 9 7 11 12 10 14 15 13 17 18 13
我認為你應該只group_by
col.site
:
library(dplyr)
df %>%
group_by(col.site) %>%
mutate(col.j = lead(col.i, default = first(col.i)))
# col.site col.month col.i col.j
# <dbl> <chr> <int> <int>
# 1 1 Jan 1 2
# 2 1 Feb 2 3
# 3 1 Mar 3 1
# 4 2 Jan 4 5
# 5 2 Feb 5 6
# 6 2 Mar 6 4
# 7 3 Jan 7 8
# 8 3 Feb 8 9
# 9 3 Mar 9 7
#10 4 Jan 10 11
#11 4 Feb 11 12
#12 4 Mar 12 10
#13 5 Jan 13 14
#14 5 Feb 14 15
#15 5 Mar 15 13
#16 6 Jan 16 17
#17 6 Feb 17 18
#18 6 Mar 18 16
使用data.table
library(data.table)
setDT(df)[, col.j := shift(col.i, type = 'lead', fill = first(col.i)), col.site]
或使用dplyr
library(dplyr)
df %>%
group_by(col.site) %>%
mutate(col.j = c(col.i[-1], col.i[1]))
-輸出
# col.site col.month col.i col.j
# <dbl> <chr> <int> <int>
# 1 1 Jan 1 2
# 2 1 Feb 2 3
# 3 1 Mar 3 1
# 4 2 Jan 4 5
# 5 2 Feb 5 6
# 6 2 Mar 6 4
# 7 3 Jan 7 8
# 8 3 Feb 8 9
# 9 3 Mar 9 7
#10 4 Jan 10 11
#11 4 Feb 11 12
#12 4 Mar 12 10
#13 5 Jan 13 14
#14 5 Feb 14 15
#15 5 Mar 15 13
#16 6 Jan 16 17
#17 6 Feb 17 18
#18 6 Mar 18 16
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.