यहां एक हल किए गए सूत्र से आगे बढ़ना: > (अपडेट किए गए कोड के लिए @Onyambu को थोड़ा धन्यवाद के साथ)।

मुझे तारों से बिल्कुल मेल खाना चाहिए - भले ही विशेष पात्र हों।

नोट - क्षमा करें यह इस मुद्दे पर तीसरा प्रश्न है। मैं लगभग वहाँ हूँ, लेकिन अब मुझे नहीं पता कि विशेष पात्रों को कैसे संभालना है और मैं अभी भी r में स्ट्रिंग्स में हेरफेर करने पर अपस्किलिंग कर रहा हूँ।

स्पष्टता के लिए अद्यतन:

मेरे पास इस तरह से मिलान शब्दों/तारों की एक तालिका है:

codes <- structure(
  list(
    column1 = structure(
      c(2L, 3L, NA),
      .Label = c("",
                 "4+", "4 +"),
      class = "factor"
    ),
    column2 = structure(
      c(1L,
        3L, 2L),
      .Label = c("old", "the money", "work"),
      class = "factor"
    ),
    column3 = structure(
      c(3L, 2L, NA),
      .Label = c("", "wonderyears",
                 "woke"),
      class = "factor"
    )
  ),
  row.names = c(NA,-3L),
  class = "data.frame"
)

और एक डेटासेट जिसमें स्ट्रिंग्स का एक कॉलम होता है। मैं देखना चाहता हूं कि स्ट्रिंग में प्रत्येक रिकॉर्ड में कोई भी कोड शामिल है या नहीं:

strings<- structure(
  list(
    SurveyID = structure(
      1:4,
      .Label = c("ID_1", "ID_2",
                 "ID_3", "ID_4"),
      class = "factor"
    ),
    Open_comments = structure(
      c(2L,
        4L, 3L, 1L),
      .Label = c(
        "I need to pick up some apples",
        "The system works",
        "Flag only if there is a 4 with a plus",
        "Show me the money"
      ),
      class = "factor"
    )
  ),
  class = "data.frame",
  row.names = c(NA,-4L)
)

मैं वर्तमान में निम्नलिखित कोड का उपयोग करके कोड को स्ट्रिंग से मिलान कर रहा हूं:

strings[names(codes)] <- lapply(codes, function(x) 
  +(grepl(paste0("\\b", na.omit(x), "\\b", collapse = "|"), strings$Open_comments)))

आउटपुट:

  SurveyID                         Open_comments column1 column2 column3
1     ID_1                      The system works       0       0       0
2     ID_2                     Show me the money       0       1       0
3     ID_3 Flag only if there is a 4 with a plus       1       0       0
4     ID_4         I need to pick up some apples       0       0       0

समस्या - पंक्ति 3 ID_3 मैं इसे केवल तभी फ़्लैग करना चाहता हूँ जब स्ट्रिंग में "4+" या "4 +" शामिल हो, लेकिन इसे वैसे भी फ़्लैग किया जा रहा है। क्या इसे ठीक से पकड़ने के लिए वैसे भी है?

1
Keelin 10 सितंबर 2020, 05:28

1 उत्तर

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

हम इसका शाब्दिक मूल्यांकन करने के लिए + से बच सकते हैं

+(grepl(paste0( "(", gsub("\\+", "\\\\+", na.omit(codes$column1)), ")",
     collapse="|"), strings$Open_comments))
#[1] 0 0 0 0

अगर हम 4+ के साथ एक स्ट्रिंग का उपयोग करते हैं, तो यह उठाएगा

+(grepl(paste0( "(", gsub("\\+", "\\\\+", na.omit(codes$column1)), ")",
     collapse="|"), "Flag only if there is a 4+ with a plus"))
#[1] 1

और कई स्तंभों के लिए

sapply(codes, function(x)+(grepl(paste0( "\\b(", 
      gsub("\\+", "\\\\+", na.omit(x)), ")\\b",
      collapse="|"), strings$Open_comments)))
#     column1 column2 column3
#[1,]       0       0       0
#[2,]       0       1       0
#[3,]       0       0       0
#[4,]       0       0       0
2
akrun 10 सितंबर 2020, 06:14