मैं कॉलम के क्रम को संरक्षित करने की कोशिश कर रहा हूं जब मैं उन्हें विस्तृत से लंबे प्रारूप में इकट्ठा करता हूं। मुझे जो समस्या आ रही है, वह है I gather और summarize ऑर्डर खो जाने के बाद। कॉलम की संख्या बहुत बड़ी है इसलिए मैं मैन्युअल रूप से ऑर्डर टाइप नहीं करना चाहता।

यहाँ एक उदाहरण है:

library(tidyr)
library(dplyr)

N <- 4
df <- data.frame(sample = c(1,1,2,2),
                 y1.1 = rnorm(N), y2.1 = rnorm(N), y10.1 = rnorm(N))
> df
  sample      y1.1      y2.1      y10.1
1      1  1.040938 0.8851727 -0.3617224
2      1  1.175879 1.0009824 -1.1352406
3      2 -1.501832 0.3446469 -1.8687008
4      2 -1.326817 0.4434628 -0.8795962

मैं जो चाहता हूं वह कॉलम के क्रम को संरक्षित करना है। कुछ हेरफेर करने के बाद, आदेश खो गया है। यहां देखा गया:

dfg <- df %>% 
  gather(key="key", value="value", -sample) %>%
  group_by(sample, key) %>%
  summarize(mean = mean(value))

> filter(dfg, sample == 1)
  sample   key       mean
   <dbl> <chr>      <dbl>
1      1  y1.1  0.2936335
2      1 y10.1  0.6170505
3      1  y2.1 -0.2250543

आप देख सकते हैं कि यह कैसे y10.1 को y2.1 से आगे रखता है जो मुझे नहीं चाहिए। मैं जो चाहता हूं वह उस आदेश को संरक्षित करना है, जिसे यहां देखा गया है:

dfg <- df %>% 
  gather(key="key", value="value", -sample)

> filter(dfg, sample == 1)
  sample   key       value
1      1  y1.1  0.60171521
2      1  y1.1 -0.01444823
3      1  y2.1  0.81566726
4      1  y2.1 -1.26577581
5      1 y10.1  0.41686388
6      1 y10.1  0.81723707

किसी कारण से group_by और summarize संचालन क्रम बदल देते हैं। मुझे यकीन नहीं है कि क्यों। मैंने ungroup कमांड की कोशिश की लेकिन वह कुछ नहीं करता है। जैसा कि मैंने पहले कहा, मेरे वास्तविक डेटा फ्रेम में कई कॉलम हैं और मुझे ऑर्डर को संरक्षित करने की आवश्यकता है। आदेश को संरक्षित करने का कारण यह है कि मैं डेटा को सही क्रम में प्लॉट कर सकता हूं।

कोई विचार?

5
Lloyd Christmas 27 अक्टूबर 2017, 21:15

5 जवाब

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

या आप कुंजी कॉलम को मूल कॉलम नामों के क्रम को दर्शाने वाले स्तरों वाले कारक में बदल सकते हैं:

df %>% 
    gather(key="key", value="value", -sample) %>%
    mutate(key=factor(key, levels=names(df)[-1])) %>% # add this line to convert the key to a factor
    group_by(sample, key) %>%
    summarize(mean = mean(value)) %>%
    filter(sample == 1)

# A tibble: 3 x 3
# Groups:   sample [1]
#  sample    key       mean
#   <dbl> <fctr>      <dbl>
#1      1   y1.1  0.8310786
#2      1   y2.1 -1.2596933
#3      1  y10.1  0.8208812
3
Psidom 27 अक्टूबर 2017, 21:23

tidyverse पैकेज अब सुरुचिपूर्ण समाधान की अनुमति देते हैं:

    library(tidyverse)
    N <- 4
    df <- data.frame(sample = c(1,1,2,2),
                    y1.1 = rnorm(N), y2.1 = rnorm(N), y10.1 = rnorm(N))
    df %>% 
        gather("key", "value", -sample, factor_key = T) %>% 
        group_by(sample, key) %>%
        summarise(mean = mean(value))

जिसके परिणामस्वरूप

    # A tibble: 6 x 3
    # Groups:   sample [2]
    sample key      mean
    <dbl> <fct>   <dbl>
    1      1 y1.1   0.0894
    2      1 y2.1   0.551 
    3      1 y10.1  0.254 
    4      2 y1.1  -0.555 
    5      2 y2.1  -1.36  
    6      2 y10.1 -0.794 
3
Alexander 3 अक्टूबर 2019, 12:56

मुझे लुकअप टेबल का उपयोग करके एक व्यावहारिक समाधान मिला। ऐसा लगता है कि यह मेरे लिए काम करता है क्योंकि मैं कॉलम नाम निकाल सकता हूं और कॉलम नाम पर ऑर्डर की गई संख्या असाइन कर सकता हूं और फिर मेरे साथ जोड़ सकता हूं data.frame

यहाँ समाधान है:

lookup <- tibble(key = c("y1.1", "y2.1", "y10.1"),
                 index = c(1,2,3))

> left_join(dfg, lookup, by="key")
# A tibble: 6 x 4
  sample   key       mean index
   <dbl> <chr>      <dbl> <dbl>
1      1  y1.1  0.2936335     1
2      1 y10.1  0.6170505     3
3      1  y2.1 -0.2250543     2
4      2  y1.1  1.3652070     1
5      2 y10.1  0.9889233     3
6      2  y2.1  0.5216553     2
1
Lloyd Christmas 27 अक्टूबर 2017, 21:17

यदि आपके कॉलम वास्तव में इसमें शामिल संख्या से आदेशित हैं, तो यह काम करना चाहिए:

library(readr)

df %>% 
  gather(key="key", value="value", -sample) %>%
  group_by(sample, key)         %>%
  summarize(mean = mean(value)) %>%
  arrange(parse_number(key))    %>%  # <- sorting by number contained in key
  filter(sample == 1)

# # A tibble: 3 x 3
# # Groups:   sample [1]
#     sample   key       mean
# <dbl> <chr>      <dbl>
#   1      1  y1.1 -0.9236688
#   2      1  y2.1 -0.2168337
#   3      1 y10.1  0.5041981
1
Moody_Mudskipper 29 अक्टूबर 2017, 14:20

फिर भी एक अन्य तरीका हो सकता है arrange उस कुंजी कॉलम के अनुकूलित संस्करण का उपयोग करके डेटाफ़्रेम जिसे आप सॉर्ट करना चाहते हैं:

library(dplyr)
library(tidyr)

df %>% 
  gather(key="key", value="value", -sample) %>%
  group_by(sample, key) %>%
  summarize(mean = mean(value)) %>%
  arrange(as.numeric(stringr::str_replace(key, "y", "")), .by_group = TRUE)

#> # A tibble: 6 x 3
#> # Groups:   sample [2]
#>   sample   key        mean
#>    <dbl> <chr>       <dbl>
#> 1      1  y1.1  0.07001689
#> 2      1  y2.1  1.15349430
#> 3      1 y10.1  1.18266024
#> 4      2  y1.1  0.42616604
#> 5      2  y2.1  1.05891682
#> 6      2 y10.1 -0.12561209
0
markdly 28 अक्टूबर 2017, 00:36