الانضمام الفرعي في R باستخدام أو شرط مع سلاسل

StackOverflow https://stackoverflow.com/questions/2125231

  •  22-09-2019
  •  | 
  •  

سؤال

لدي إطار بيانات يحتوي على حوالي 40 عمودًا ، يحتوي العمود الثاني ، Data [2] على اسم الشركة التي تصفها بقية بيانات الصف. ومع ذلك ، فإن أسماء الشركات مختلفة اعتمادًا على العام (Thering 09 for 2009 ، لا شيء لعام 2010).

أود أن أكون قادرًا على مجموعة البيانات بحيث يمكنني سحبها في كلا العامين مرة واحدة. إليك مثال على ما أحاول القيام به ...

subset(data, data[2] == "Company Name 09" | "Company Name", drop = T) 

في الأساس ، أواجه صعوبة في استخدام أو المشغل داخل وظيفة المجموعة الفرعية.

ومع ذلك ، فقد جربت بدائل أخرى:

subset(data, data[[2]] == grep("Company Name", data[[2]]))

ربما هناك طريقة أسهل للقيام بذلك باستخدام وظيفة سلسلة؟

سيتم تقديم أي أفكار.

هل كانت مفيدة؟

المحلول

بادئ ذي بدء (كما فعل جوناثان في تعليقه) للإشارة إلى العمود الثاني ، يجب عليك استخدامك أيضًا data[[2]] أو data[,2]. ولكن إذا كنت تستخدم مجموعة فرعية ، فيمكنك استخدام اسم العمود: subset(data, CompanyName == ...).

ولأنك سؤال سأفعل واحدة من:

subset(data, data[[2]] %in% c("Company Name 09", "Company Name"), drop = TRUE) 
subset(data, grepl("^Company Name", data[[2]]), drop = TRUE)

في الثانية أستخدم grepl (تم تقديمه مع R الإصدار 2.9) الذي يعيد المتجه المنطقي مع TRUE للمباراة.

نصائح أخرى

شيئين:

1) بيانات النماذج مفيدة لأننا لا نعرف بالضبط ما تواجهه. يرجى تقديم البيانات إن أمكن. ربما أساءت فهم ما يلي؟

2) لا تستخدم [[2]] لفهرسة بياناتك. الإطار ، أعتقد [، "Colname"] أكثر وضوحًا

3) إذا كان الاختلاف الوحيد هو "09" في الاسم ، فما عليك سوى إعادة صياغة ذلك:

R> x1 <- c("foo 09", "bar", "bar 09", "foo")
R> x2 <- gsub(" 09$", "", x1)
[1] "foo" "bar" "bar" "foo"
R> 

الآن يجب أن تكون قادرًا على القيام بمجموعتك الفرعية على البيانات التي تم تحويلها على أساس النقل:

R> data <- data.frame(value=1:4, name=x1)
R> subset(data, gsub(" 09$", "", name)=="foo")
  value   name
1     1 foo 09
4     4    foo
R> 

يمكنك أيضًا استبدال عمود الاسم بقيمة regexp'ed.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top