簡體   English   中英

在 R 中循環數據框和列

[英]Looping over Dataframes and Columns in R

我有一個具有這種結構的數據框:

df <- read.table(text="
site  date  v1  v2  v3  v4
a 2019-08-01  0 17  94  150
b 2019-08-01  5 25  83  148
c 2019-08-01  6 39  43  148
d 2019-08-01  10  39  144 165
a 2019-03-31  4 15  106 154
b 2019-03-31  4 21  70  151
c 2019-03-31  8 30  44  148
d 2019-03-31  9 41  144 160
a 2019-01-04  3 10  104 153
b 2019-01-04  2 16  90  150
c 2019-01-04  8 40  62  151
d 2019-01-04  9 43  142 162
a 2019-07-07  3 14  93  152
b 2019-07-07  2 23  74  147
c 2019-07-07  9 31  58  147
d 2019-07-07  9 36  123 170
a 2019-06-17  0 12  91  153
b 2019-06-17  3 25  73  147
c 2019-06-17  7 35  45  146
d 2019-06-17  8 40  134 168
a 2019-01-11  4 14  104 153
b 2019-01-11  5 18  73  151
c 2019-01-11  7 35  65  147
d 2019-01-11  11  44  134 168
a 2019-11-11  4 20  103 152 
b 2019-11-11  6 22  79  152
c 2019-11-11  5 38  52  147
d 2019-11-11  10  38  144 163
a 2019-09-06  3 13  102 155
b 2019-09-06  6 17  74  149
c 2019-09-06  9 32  45  146
d 2019-09-06  11  42  138 165
", header=TRUE, stringsAsFactors=FALSE)

現在,我想計算每個站點全年(僅夏季和冬季)的變量 (v1 - v4) 的統計量(最小值、最大值、平均值、中值、標准差)。

首先,我使用以下代碼對夏季和冬季的數據進行了子集化:

df_summer <- selectByDate(df, month = c(4:9))
df_winter <- selectByDate(df, month = c(1,2,3,10,11,12))

然后我嘗試為季節和變量建立一個循環。 為此,我創建了兩個列表:

df_list <- list(df, df_summer, df_winter)
col_names <- c("v1", "v2", "v3", "v4")

然后我嘗試在循環中實現:

for (i in seq_along(df_list)){
  for (j in col_names[,i]){
    [j]_[i] <- describeBy([i]$[,j], [i]$site)
    [j]_[i] <- data.frame(matrix(unlist([j]_[i]), nrow=length([j]_[i]), byrow=T))
    [j]_[i]$site <- c("Frau2", "MW", "Sys1", "Sys4")
    [j]_[i]$season <- c([i], [i], [i], [i])
    [j]_[i]$type <- c([j], [j], [j], [j])
  } 
}

但這不起作用 - 我收到消息:

Error: unexpected '[' in: 
"for (j in col_names[,i]){
["

Error: unexpected '[' in "   ["

Error: unexpected '}' in "   }"

我已經使用循環-“工作流程”來生成我想要的數據,但這是通過復制和粘貼來完成的,以便快速獲取數據。 現在我想整理一下代碼。

你有什么想法我怎么能讓這個工作或者我做錯了什么?

謝謝!

馬蒂亞斯

更新

所以我嘗試了 ekoam 的建議——謝謝你! - 並且出現了以下問題。

與我在 ekoam 的答案下面寫的評論相反,錯誤發生在兩個數據集(此處提供的示例和我正在使用的實際數據集 - 我不確定是否允許我發布數據集)。 這是我使用過的代碼和我得到的錯誤:

Error: Must subset columns with a valid subscript vector.
x Subscript has the wrong type `list`.
i It must be numeric or character.
Run `rlang::last_error()` to see where the error occurred.

> rlang::last_error()
Error in `*tmp*`[[id - n]] : 
  attempt to select more than one element in integerOneIndex

並收到此錯誤:

 Error: Must subset columns with a valid subscript vector. x Subscript has the wrong type `list`. i It must be numeric or character. Run `rlang::last_error()` to see where the error occurred. > rlang::last_error() Error in `*tmp*`[[id - n]] : attempt to select more than one element in integerOneIndex

謝謝你的幫助!

馬蒂亞斯

如果您希望事情保持整潔,那么這種tidyverse方法如何解決您的問題?

library(dplyr)
library(tidyr)

my_summary <- 
  . %>% 
  group_by(site) %>% 
  summarise(across(
    c(v1, v2, v3, v4), 
    list(min = min, max = max, mean = mean, median = median, sd = sd)
  )) %>% 
  pivot_longer(-site, names_to = c("type", "stat"), names_sep = "_") %>% 
  pivot_wider(names_from = "stat")
  
summer <- as.integer(format.Date(df$date, "%m")) %in% 4:9
df_list <- list(full_year = df, summer = df[summer, ], winter = df[!summer, ])
lapply(df_list, my_summary)

輸出

`summarise()` ungrouping output (override with `.groups` argument)
`summarise()` ungrouping output (override with `.groups` argument)
`summarise()` ungrouping output (override with `.groups` argument)
$full_year
# A tibble: 16 x 7
   site  type    min   max   mean median    sd
   <chr> <chr> <dbl> <dbl>  <dbl>  <dbl> <dbl>
 1 a     v1        0     4   2.62    3    1.69
 2 a     v2       10    20  14.4    14    3.07
 3 a     v3       91   106  99.6   102.   5.93
 4 a     v4      150   155 153.    153    1.49
 5 b     v1        2     6   4.12    4.5  1.64
 6 b     v2       16    25  20.9    21.5  3.52
 7 b     v3       70    90  77      74    6.63
 8 b     v4      147   152 149.    150.   1.92
 9 c     v1        5     9   7.38    7.5  1.41
10 c     v2       30    40  35      35    3.78
11 c     v3       43    65  51.8    48.5  8.84
12 c     v4      146   151 148.    147    1.60
13 d     v1        8    11   9.62    9.5  1.06
14 d     v2       36    44  40.4    40.5  2.67
15 d     v3      123   144 138.    140    7.38
16 d     v4      160   170 165.    165    3.40

$summer
# A tibble: 16 x 7
   site  type    min   max   mean median    sd
   <chr> <chr> <dbl> <dbl>  <dbl>  <dbl> <dbl>
 1 a     v1        0     3   1.5     1.5 1.73 
 2 a     v2       12    17  14      13.5 2.16 
 3 a     v3       91   102  95      93.5 4.83 
 4 a     v4      150   155 152.    152.  2.08 
 5 b     v1        2     6   4       4   1.83 
 6 b     v2       17    25  22.5    24   3.79 
 7 b     v3       73    83  76      74   4.69 
 8 b     v4      147   149 148.    148.  0.957
 9 c     v1        6     9   7.75    8   1.5  
10 c     v2       31    39  34.2    33.5 3.59 
11 c     v3       43    58  47.8    45   6.90 
12 c     v4      146   148 147.    146.  0.957
13 d     v1        8    11   9.5     9.5 1.29 
14 d     v2       36    42  39.2    39.5 2.5  
15 d     v3      123   144 135.    136   8.85 
16 d     v4      165   170 167     166.  2.45 

$winter
# A tibble: 16 x 7
   site  type    min   max   mean median    sd
   <chr> <chr> <dbl> <dbl>  <dbl>  <dbl> <dbl>
 1 a     v1        3     4   3.75    4   0.5  
 2 a     v2       10    20  14.8    14.5 4.11 
 3 a     v3      103   106 104.    104   1.26 
 4 a     v4      152   154 153     153   0.816
 5 b     v1        2     6   4.25    4.5 1.71 
 6 b     v2       16    22  19.2    19.5 2.75 
 7 b     v3       70    90  78      76   8.83 
 8 b     v4      150   152 151     151   0.816
 9 c     v1        5     8   7       7.5 1.41 
10 c     v2       30    40  35.8    36.5 4.35 
11 c     v3       44    65  55.8    57   9.60 
12 c     v4      147   151 148.    148.  1.89 
13 d     v1        9    11   9.75    9.5 0.957
14 d     v2       38    44  41.5    42   2.65 
15 d     v3      134   144 141     143   4.76 
16 d     v4      160   168 163.    162.  3.40 

暫無
暫無

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

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