الانضمام الفرعي في R باستخدام أو شرط مع سلاسل
سؤال
لدي إطار بيانات يحتوي على حوالي 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.