मैं दो श्रेणीबद्ध स्तंभों की शर्तों के आधार पर एक सतत स्तंभ से मूल्यों को कम करना चाहता हूं।

> df.example <- data.frame(V1 = c("A", "A", "A", "B", "B", "B", "A", "A", "B", "B"),
+                V2 = c("B",  "A",  "B", "A", "B",  "A", "B",  "A", "B",  "A"),
+                     V3 = c("5",  "3",  "1", "7", "11", "2", "2", "11", "1", "3"))  
> df.example
   V1 V2 V3
1   A  B  5
2   A  A  3
3   A  B  1
4   B  A  7
5   B  B 11
6   B  A  2
7   A  B  2
8   A  A 11
9   B  B  1
10  B  A  3

Df.example से मैं उन पंक्तियों को पुनः प्राप्त करना चाहूंगा जहां V1 = V2 के प्रत्येक अद्वितीय संयोजन के लिए V3 अधिकतम है; यहां

5   B  B 11
8   A  A 11

और प्रत्येक अद्वितीय संयोजन के लिए न्यूनतम जब V1=/V2; यहां

3    A  B  1
10   B  A  3

यह निश्चित रूप से सरल है, मेरे डेटा फ़्रेम में V1 और V2 में 100 श्रेणियां हैं।

3
Thijs van den Burg 23 मार्च 2020, 18:31

3 जवाब

यहाँ एक डेटा.टेबल दृष्टिकोण है।

library(data.table)
setDT(df.example)
#In supplied data, V3 is a character vector
df.example[,V3 := as.numeric(as.matrix(V3))]
df.example[,lapply(.SD,function(x){
  if(V1==V2)
    {max(V3)}
  else
    {min(V3)}})
  ,by=list(V1,V2)]
   V1 V2 V3
1:  A  B  1
2:  A  A 11
3:  B  A  2
4:  B  B 11
2
Ian Campbell 23 मार्च 2020, 18:51

एक अन्य विकल्प:

library(dplyr)

df.example %>%
  group_by(V1, V2) %>%
  filter(V3 == eval(parse(text = paste0(c('max', 'min')[(V1 != V2) + 1], '(V3)'))))

आउटपुट:

# A tibble: 4 x 3
# Groups:   V1, V2 [4]
  V1    V2       V3
  <chr> <chr> <int>
1 A     B         1
2 B     B        11
3 B     A         2
4 A     A        11

या dplyr में @IanCampbell के समान:

library(dplyr)

df.example %>%
  group_by(V1, V2) %>%
  filter(if (V1 != V2) V3 == min(V3) else V3 == max(V3))

यदि आपका V3 वास्तव में integer नहीं है, तो बस mutate(V3 = as.integer(as.character(V3))) %>% को दूसरे चरण के रूप में जोड़ें।

1
arg0naut91 23 मार्च 2020, 18:59
1
मुझे eval (पार्स ()) का सुरुचिपूर्ण उपयोग पसंद है।
 – 
Ian Campbell
23 मार्च 2020, 19:06
धन्यवाद - मुझे लगता है कि आपने जो सुझाव दिया है वह फिर भी ठीक रहेगा। मैं यह भी कह रहा हूं क्योंकि eval(parse()) की वास्तव में अनुशंसा नहीं की जाती है, इसलिए इसका उपयोग stackoverflow.com/questions/13649979/…
 – 
arg0naut91
23 मार्च 2020, 19:11

dplyr का उपयोग करने वाली एक संभावना यह हो सकती है:

df.example %>%
 filter(V1 == V2) %>%
 group_by(V1, V2) %>%
 summarise_all(max) %>%
 bind_rows(df.example %>%
            filter(V1 != V2) %>%
            group_by(V1, V2) %>%
            summarise_all(min))

  V1    V2       V3
  <fct> <fct> <dbl>
1 A     A        11
2 B     B        11
3 A     B         1
4 B     A         2
0
tmfmnk 23 मार्च 2020, 18:38