簡體   English   中英

如何在 R dataframe 中將數據從第 i 行第 2 列更新到第 j 行第 1 列但由兩個變量 (dplyr) 分組?

[英]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.

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