नीचे दी गई तालिका में, मैं प्रत्येक पंक्ति में दो उच्चतम मान कैसे प्राप्त कर सकता हूं, फिर इन मानों को एक साथ जोड़ सकता हूं?

मेरे पास RStudio में संलग्न तालिका की एक प्रति है। क्या कोड की एक पंक्ति है जिसका उपयोग मैं प्रत्येक पंक्ति पर दो उच्चतम संख्याओं को जोड़ने के लिए कर सकता हूं, ताकि मैं इसे एक बहुत बड़े डेटासेट पर लागू कर सकूं?

Table

0
mc_awesome 30 नवम्बर 2020, 17:12

4 जवाब

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

आप एक पंक्तिबद्ध गणना कर सकते हैं जहां आप निर्दिष्ट कॉलम में मानों को क्रमबद्ध करते हैं और उच्चतम दो को जोड़ते हैं:

library(dplyr)

df <- data.frame(Mon = c(12,15,42,43,56,73,23),
                 Tues = c(15,14,12,75,98,79,68),
                 Wed = c(13,42,35,64,35,95,56),
                 Thur = c(23,46,32,94,78,68,35),
                 Friday = c(25,23,64,35,27,54,32))



df %>% 
  rowwise() %>% 
  mutate(two_max = sum(sort(c(Mon, Tues, Wed, Thur, Friday), decreasing = TRUE)[1:2])) %>% 
  ungroup()

यदि आप मैन्युअल रूप से कॉलम नाम निर्दिष्ट नहीं करना चाहते हैं, तो आप एक साथ सभी संख्यात्मक कॉलम भी चुन सकते हैं:


df %>% 
  rowwise() %>% 
  mutate(two_max = sum(sort(c_across(where(is.numeric)), decreasing = TRUE)[1:2])) %>% 
  ungroup()

दोनों रणनीतियाँ परिणाम देती हैं:


# A tibble: 7 x 6
    Mon  Tues   Wed  Thur Friday two_max
  <dbl> <dbl> <dbl> <dbl>  <dbl>   <dbl>
1    12    15    13    23     25      48
2    15    14    42    46     23      88
3    42    12    35    32     64     106
4    43    75    64    94     35     169
5    56    98    35    78     27     176
6    73    79    95    68     54     174
7    23    68    56    35     32     124
1
pieterbons 30 नवम्बर 2020, 18:46

यदि आप वन-लाइनर पसंद करते हैं, तो वह लें

df <- data.frame(Mon = c(12,15,42,43,56,73,23),
                 Tues = c(15,14,12,75,98,79,68),
                 Wed = c(13,42,35,64,35,95,56),
                 Thur = c(23,46,32,94,78,68,35),
                 Friday = c(25,23,64,35,27,54,32))

sol <- apply(df, 1, function(x) sum(max(x), max(x[-which(x == max(x))[1]])))

ध्यान दें कि थोड़े अधिक कुशल तरीके हैं। Lmk अगर आप उन्हें सुनना चाहते हैं

0
okost 14 जिंदा 2021, 17:44

उदाहरण के तौर पर mtcars के साथ apply का उपयोग करना:

top2 <- x <- apply(mtcars, 1, function(x) sort(x, decreasing = TRUE)[1:2])
top2 <- matrix(top2, ncol = 2, byrow = TRUE)
addem <- rowSums(top2)
top2plus <- cbind(mtcars, addem)
head(top2plus, 5)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb addem
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4   270
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4   270
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1   201
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1   368
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2   535
0
SteveM 30 नवम्बर 2020, 17:39

ऐसा करने का एक तरीका यह होगा कि डेटाफ़्रेम को साफ-सुथरा डेटा (यानी एक चर के रूप में दिन, दूसरे के रूप में मान) के लिए फिर से आकार दिया जाए, और डेटा को सारांश में संसाधित करने के लिए dplyr क्रियाओं का उपयोग करें:

df <- data.frame(ID = LETTERS[1:7],
                 Mon = c(12, 15, 42, 43, 56, 73, 23),
                 Tues = c(15, 14, 12, 75, 98, 79, 68),
                 Wed = c(13, 42, 35, 64, 35, 95, 56),
                 Thur = c(23, 46, 32, 94, 78, 68, 35),
                 Friday = c(25, 23, 64, 35, 27, 54, 32))

library(dplyr)
library(tidyr)
df %>% 
  pivot_longer(-ID) %>%         # reshape
  group_by(ID) %>%              # change scope to each ID
  slice_max(value, n = 2) %>%   # keep two maximums
  summarise(max2 = sum(value))  # sum them
#> # A tibble: 7 x 2
#>   ID     max2
#>   <chr> <dbl>
#> 1 A        48
#> 2 B        88
#> 3 C       106
#> 4 D       169
#> 5 E       176
#> 6 F       174
#> 7 G       124

2020-12-01 को reprex पैकेज द्वारा बनाया गया (v0.3.0)

0
stragu 30 नवम्बर 2020, 17:37