मैं कॉलम के क्रम को संरक्षित करने की कोशिश कर रहा हूं जब मैं उन्हें विस्तृत से लंबे प्रारूप में इकट्ठा करता हूं। मुझे जो समस्या आ रही है, वह है 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 जवाब
या आप कुंजी कॉलम को मूल कॉलम नामों के क्रम को दर्शाने वाले स्तरों वाले कारक में बदल सकते हैं:
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
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
मुझे लुकअप टेबल का उपयोग करके एक व्यावहारिक समाधान मिला। ऐसा लगता है कि यह मेरे लिए काम करता है क्योंकि मैं कॉलम नाम निकाल सकता हूं और कॉलम नाम पर ऑर्डर की गई संख्या असाइन कर सकता हूं और फिर मेरे साथ जोड़ सकता हूं 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
यदि आपके कॉलम वास्तव में इसमें शामिल संख्या से आदेशित हैं, तो यह काम करना चाहिए:
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
फिर भी एक अन्य तरीका हो सकता है 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