मुझे दो डेटा फ़्रेम मर्ज करने की आवश्यकता है: पूर्ण 10 और INSIDECostaRica। कोस्टा रिका के अंदर कंप्लीट10 में डेटा का एक सबसेट है जो समान है लेकिन कुछ विशिष्ट RICHNESS मानों के साथ 0 से 0.5 में बदल गया है (ताकि मैं बाद में इनके द्वारा फ़िल्टर कर सकूं)। मैंने उन्हें कई तरीकों से विलय करने की कोशिश की, लेकिन ऐसा लगता है कि मेरी पंक्तियों को 0.5 के साथ रखने का एकमात्र तरीका सभी = सत्य का उपयोग करना है, जिसका अर्थ है कि मैं इन पंक्तियों के डुप्लीकेट, 0 पंक्ति और 0.5 पंक्ति के साथ समाप्त होता हूं। मैं 0 मानों वाली पंक्तियों को हटाने के लिए विशिष्ट फ़ंक्शन का उपयोग करना चाहता हूं जो अन्यथा 0.5 पंक्ति में डुप्लिकेट हैं, लेकिन मुझे लगता है कि यह मेरी 0.5 पंक्तियों को हटा देगा क्योंकि मेरे विलय ने इन मानों को मेरे डेटासेट के अंत में संलग्न किया है। उदाहरण के लिए, यह मेरा मर्ज जैसा दिखता था, और मर्ज के बाद मेरे पास यही है:

MergeTest<-merge(Complete10,INSIDECostaRica,by=c("GRID","x.centroids","y.centroids","RICHNESS"),all=TRUE)

GRID   LONG   LAT   RICHNESS
75      5      6     0
75      5      6     0.5
76      8      4     12
77      2      7     0
78      4      3     0
78      4      3     0.5

और यही वह है जो मैं चाहता हूं:

GRID   LONG   LAT   RICHNESS
75      5      6     0.5
76      8      4     12
77      2      7     0
78      4      3     0.5

मैं RICHNESS से सभी शून्य को हटाना नहीं चाहता, केवल वे शून्य जो 0.5 के डुप्लीकेट हैं।

r
0
ElizaBeso000 14 पद 2020, 07:37

2 जवाब

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

यह काम करेगा

library(tidyverse)

MergeTest %>% group_by(GRID, LONG, LAT) %>% arrange(RICHNESS) %>% slice_tail()

# A tibble: 4 x 4
# Groups:   GRID, LONG, LAT [4]
   GRID  LONG   LAT RICHNESS
  <int> <int> <int>    <dbl>
1    75     5     6      0.5
2    76     8     4     12  
3    77     2     7      0  
4    78     4     3      0.5

या

MergeTest %>% group_by(GRID, LONG, LAT) %>% filter(!(n()>1 & RICHNESS == 0))

# A tibble: 4 x 4
# Groups:   GRID, LONG, LAT [4]
   GRID  LONG   LAT RICHNESS
  <int> <int> <int>    <dbl>
1    75     5     6      0.5
2    76     8     4     12  
3    77     2     7      0  
4    78     4     3      0.5


नमूना dput

> dput(MergeTest)
structure(list(GRID = c(75L, 75L, 76L, 77L, 78L, 78L), LONG = c(5L, 
5L, 8L, 2L, 4L, 4L), LAT = c(6L, 6L, 4L, 7L, 3L, 3L), RICHNESS = c(0, 
0.5, 12, 0, 0, 0.5)), class = "data.frame", row.names = c(NA, 
-6L))
0
AnilGoyal 14 पद 2020, 08:18

विलय के बाद एक तरीका यह होगा कि प्रत्येक समूह के लिए RICHNESS का अधिकतम मान रखा जाए।

library(dplyr)
result <- MergeTest %>%
            group_by(GRID, LONG, LAT) %>%
            slice(which.max(RICHNESS))

मुझे लगता है कि आप अपने merge चरण को ठीक कर सकते हैं यदि आप 'RICHNESS' कॉलम को Complete10 से हटाते हैं यदि आप इसका मान केवल INSIDECostaRica से रखना चाहते हैं।

MergeTest<-merge(Complete10[setdiff(names(Complete10), 'RICHNESS')],
                INSIDECostaRica,by=c("GRID","x.centroids","y.centroids"))
0
Ronak Shah 14 पद 2020, 07:52