سؤال

ملحوظة: لقد غيرت المثال من عندما نشرت لأول مرة. كان المثال الأول مبسرا للغاية لالتقاط المشكلة الحقيقية.

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

لذلك لدي هذا:

state<-c("IA","IA","IA","IL","IL","IL")
value1<-c(1,2,3,4,5,6)
s1<-data.frame(state,value1)
state<-c("IL","IL","IL","IA","IA","IA")
value2<-c(3,4,5,6,7,8)
s2<-data.frame(state,value2)

s1
s2

الذي يعود هذا:

> s1
  state value1
1    IA      1
2    IA      2
3    IA      3
4    IL      4
5    IL      5
6    IL      6
> s2
  state value2
1    IL      3
2    IL      4
3    IL      5
4    IA      6
5    IA      7
6    IA      8

وأريد هذا:

  state value1 value2
1    IA      1      6
2    IA      2      7
3    IA      3      8
4    IL      4      3
5    IL      5      4
6    IL      6      5

أنا على وشك قيادتي سخيفة في محاولة لحل هذا. يبدو أنه ينبغي أن يكون مشكلة منخفضة بسيطة.

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

المحلول

هناك عدة طرق للقيام بذلك (إنها ص، بعد كل شيء)، لكنني أعتقد أن أكثر الوضوح يخلق فهرس. نحتاج إلى دالة تنشئ مؤشر تسلسلي (بدءا من واحد وينتهي مع عدد الملاحظات).

seq_len(3) 
> [1] 1 2 3

لكننا نحتاج إلى حساب هذا الفهرس داخل كل متغير التجمع (الدولة). لهذا يمكننا استخدام ص ave وظيفة. يتطلب الأمر رقيبا كوسيطة الأول، ثم عوامل التجمع، وأخيرا الوظيفة المراد تطبيقها في كل مجموعة.

s1$index <- with(s1,ave(value1,state,FUN=seq_len))
s2$index <- with(s2,ave(value2,state,FUN=seq_len))

(لاحظ استخدام with, ، والتي تحدد ص البحث عن المتغيرات داخل البيئة / dataframe. هذه هي ممارسة أفضل من استخدام S1 $ Value1، S2 $ value2، إلخ.)

الآن يمكننا ببساطة دمج (الانضمام) إطارات البيانات (بواسطة المتغيرات الموجودة في كلا إطارات البيانات: الحالة والفهرس).

merge(s1,s2)

الذي يعطي

   state index value1 value2
1    IA     1      1      6
2    IA     2      2      7
3    IA     3      3      8
4    IL     1      4      3
5    IL     2      5      4
6    IL     3      6      5

لهذا العمل، يجب أن يكون هناك نفس عدد الملاحظات من قبل الدولة في كل إطارات البيانات.

تحرير: علق رمز الوضوح.] [تحرير: يستخدم SEQ_LEN بدلا من إنشاء وظيفة جديدة كما اقترح هادلي.

نصائح أخرى

ملاحظة: تحقق من التعليق الخامس على الإجابة أعلاه. يجب أن يكون الحل

s1$index <- with(s1,ave(value1,state,FUN=seq_along))
s2$index <- with(s2,ave(value2,state,FUN=seq_along))

اختبارها والعمل.

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