library(tidyverse)

निम्नलिखित गहराई के लिए साधनों की गणना कैसे करें: 1-2, 1-3, 1-4, …, 1-10 चर y और z के लिए। ध्यान दें कि मेरे वास्तविक डेटा में मेरे पास समान रूप से जगह की गहराई नहीं है, इसलिए मैं वास्तव में सीधे रोलप्लाई का उपयोग नहीं कर सकता।

set.seed(123)
df <- data.frame(depth = seq(1, 10, length.out = 100), y = rnorm(100), z = rnorm(100))

head(df)
#>      depth           y           z
#> 1 1.000000 -0.56047565 -0.71040656
#> 2 1.090909 -0.23017749  0.25688371
#> 3 1.181818  1.55870831 -0.24669188
#> 4 1.272727  0.07050839 -0.34754260
#> 5 1.363636  0.12928774 -0.95161857
#> 6 1.454545  1.71506499 -0.04502772

वांछित आउटपुट का उदाहरण

df %>% 
  filter(between(depth, 1, 2)) %>% 
  summarise_at(vars(y, z), mean) %>% 
  mutate(start_depth = 1, end_depth = 2)
#>           y          z start_depth end_depth
#> 1 0.1941793 -0.3271552           1         2

df %>% 
  filter(between(depth, 1, 3)) %>% 
  summarise_at(vars(y, z), mean) %>% 
  mutate(start_depth = 1, end_depth = 3)
#>            y          z start_depth end_depth
#> 1 0.02263796 -0.3699128           1         3

df %>% 
  filter(between(depth, 1, 4)) %>% 
  summarise_at(vars(y, z), mean) %>% 
  mutate(start_depth = 1, end_depth = 4)
#>            y          z start_depth end_depth
#> 1 0.01445704 -0.1993295           1         4

2018-10-23 को reprex पैकेज द्वारा बनाया गया (v0.2.1)

0
Philippe Massicotte 23 अक्टूबर 2018, 20:30

1 उत्तर

सबसे बढ़िया उत्तर

ओपी के पास पहले से ही एक बार में आउटपुट बनाने के लिए कोड है, इसलिए मुझे लगता है कि अनुरोध यह सब एक बार में करना है:

library(data.table)
setDT(df)

cols = c("y", "z")
mDT = data.table(start_depth = 1, end_depth = as.numeric(1:10))
res = df[mDT, on=.(depth >= start_depth, depth <= end_depth), 
  lapply(.SD, mean), by=.EACHI, .SDcols=cols]    
setnames(res, c(names(mDT), cols))

    start_depth end_depth           y           z
 1:           1         1 -0.56047565 -0.71040656
 2:           1         2  0.19417934 -0.32715522
 3:           1         3  0.02263796 -0.36991283
 4:           1         4  0.01445704 -0.19932946
 5:           1         5  0.06702734 -0.27118566
 6:           1         6  0.08145323 -0.21811183
 7:           1         7  0.03197788 -0.13311881
 8:           1         8  0.01918313 -0.10335488
 9:           1         9  0.03956002 -0.08520866
10:           1        10  0.09040591 -0.10754680

यह एक गैर-समान जुड़ाव है। अतिरिक्त setnames चरण जल्द ही बदल सकता है

यदि आपकी श्रेणियां मनमानी हैं तो एक गैर-समतुल्य जुड़ाव उपयुक्त हो सकता है, लेकिन ओपी के मामले में, यह केवल एक बढ़ती हुई सीमा है इसलिए प्राकृतिक समाधान एक रोलिंग गणना है (उदाहरण के लिए RcppRoll के साथ)।

2
Frank 23 अक्टूबर 2018, 18:15