आर में, मैं यह कोशिश कर रहा हूँ:

  1. "Item_List" तालिका के साथ, "विवरण" कॉलम खोजें जिसमें है: 1a। शब्द "बीटीई", और 2 बी। शब्द "आरआईसी" या "आरआईटीसी" या दोनों
  2. मुझे इन पंक्तियों की अनुक्रमणिका (पंक्ति संख्या) चाहिए।
  3. एक नया कॉलम "समीक्षा 1" बनाएं, ऊपर चरण 2 द्वारा पहचानी गई पंक्तियों में "हां" दर्ज करें।

यहाँ मेरी डेटा फ़ाइल है:

https://drive.google.com/file/d/1uUlCf9LaU97HcHc1ehbbJ9yLjSn94n29/view?usp=sharing

library(readxl)
library(stringr)

मेरे पास यह बेकार कोड है (वे काम करते हैं):

match1 <- which(str_detect(Item_List$Description, "BTE"))
match2 <- which(str_detect(Item_List$Description, "(RITC)|(RIC)"))
match_result <- intersect(match1, match2)
Item_List$Review1 <- ""
Item_List$Review1[match_result] <- "Yes"

लेकिन मेरे प्रश्न हैं:

ए। क्या उपरोक्त "मैच 1" और "मैच 2" के बजाय रेगेक्स कोड की एक पंक्ति में हो सकता है?

B. पाइप नीचे काम क्यों नहीं करता है?

Item_List %>%
  which(str_detect(pattern = "BTE"))
0
Steve 7 फरवरी 2021, 08:08

2 जवाब

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

आप match1 और match2 को एक पंक्ति में इस प्रकार जोड़ सकते हैं:

library(dplyr)
library(stringr)

Item_List %>%
  mutate(Review1 = if_else(str_detect(Description,'BTE.*(RITC|RIC)|(RITC|RIC).*BTE'),
                           'Yes', ''))

#  Product     `Product Code` Manufacturer Description                             Review1
#   <chr>       <chr>          <chr>        <chr>                                   <chr>  
# 1 Hearing Aid 11516117       WIDEX        BEYOND 220 FUSION BTE RITC Digital      "Yes"  
# 2 Hearing Aid 11516116       WIDEX        BEYOND 330 FUSION BTE RITC Digital      "Yes"  
# 3 Hearing Aid 11516114       WIDEX        BEYOND 440 FUSION BTE RITC Digital      "Yes"  
# 4 Hearing Aid 11522324       WIDEX        EVOKE 110 BTE 13 D BTE Standard Digital ""     
# 5 Hearing Aid 11912651       WIDEX        EVOKE 110 CIC CIC Digital               ""     
# 6 Hearing Aid 11912682       WIDEX        EVOKE 110 E-IM HS Half Shell Digital    ""     
# 7 Hearing Aid 11912678       WIDEX        EVOKE 110 E-IM ITC Canal Digital        ""     
# 8 Hearing Aid 11912650       WIDEX        EVOKE 110 E-IM ITE Full Shell Digital   ""     
# 9 Hearing Aid 11912674       WIDEX        EVOKE 110 E-IP HS Half Shell Digital    ""     
#10 Hearing Aid 11912670       WIDEX        EVOKE 110 E-IP ITC Canal Digital        ""     
# … with 186 more rows

जिसे आधार R में इस प्रकार लिखा जा सकता है:

transform(Item_List, Review1 = ifelse(grepl('BTE.*(RITC|RIC)|(RITC|RIC).*BTE', 
                                      Description), 'Yes', ''))

दूसरे प्रश्न के लिए,

Item_List %>% which(str_detect(pattern = "BTE"))

यह काम नहीं करता है क्योंकि आप एक डेटाफ़्रेम (Item_List) से which पास कर रहे हैं। तुम यह कर सकते थे :

Item_List %>%
  pull(Description) %>%
  str_detect(pattern = "BTE") %>%
  which()
1
Ronak Shah 7 फरवरी 2021, 09:07

हाँ, यह सब grepl() फ़ंक्शन के साथ एक चरण में किया जा सकता है।


Item_List$Review1 <- grepl("(?=.*BTE)(?=.*RIC|.*RITC)", Item_List$Description, perl = TRUE)

1
David J. Bosak 7 फरवरी 2021, 08:36