আমার কাছে একটি অনলাইন জরিপ থেকে ডেটা রয়েছে যেখানে উত্তরদাতারা 1-3 টি প্রশ্নের লুপ দিয়ে যায়। জরিপ সফ্টওয়্যার (Qualtrics) একাধিক কলাম-যে এই ডেটা রেকর্ড, জরিপ Q3.2 কলাম থাকবে Q3.2.1.
, Q3.2.2.
এবং Q3.2.3.
:
df <- data.frame(
id = 1:10,
time = as.Date('2009-01-01') + 0:9,
Q3.2.1. = rnorm(10, 0, 1),
Q3.2.2. = rnorm(10, 0, 1),
Q3.2.3. = rnorm(10, 0, 1),
Q3.3.1. = rnorm(10, 0, 1),
Q3.3.2. = rnorm(10, 0, 1),
Q3.3.3. = rnorm(10, 0, 1)
)
# Sample data
id time Q3.2.1. Q3.2.2. Q3.2.3. Q3.3.1. Q3.3.2. Q3.3.3.
1 1 2009-01-01 -0.2059165 -0.29177677 -0.7107192 1.52718069 -0.4484351 -1.21550600
2 2 2009-01-02 -0.1981136 -1.19813815 1.1750200 -0.40380049 -1.8376094 1.03588482
3 3 2009-01-03 0.3514795 -0.27425539 1.1171712 -1.02641801 -2.0646661 -0.35353058
...
আমি সমস্ত কিউএন.এন * কলামগুলিকে পরিপাটি স্বতন্ত্র কিউএন.এন কলামগুলিতে একত্রিত করতে চাই, শেষ পর্যন্ত এরকম কিছু দিয়ে শেষ করব:
id time loop_number Q3.2 Q3.3
1 1 2009-01-01 1 -0.20591649 1.52718069
2 2 2009-01-02 1 -0.19811357 -0.40380049
3 3 2009-01-03 1 0.35147949 -1.02641801
...
11 1 2009-01-01 2 -0.29177677 -0.4484351
12 2 2009-01-02 2 -1.19813815 -1.8376094
13 3 2009-01-03 2 -0.27425539 -2.0646661
...
21 1 2009-01-01 3 -0.71071921 -1.21550600
22 2 2009-01-02 3 1.17501999 1.03588482
23 3 2009-01-03 3 1.11717121 -0.35353058
...
tidyr
লাইব্রেরি gather()
ফাংশন, যা মিশ্রন জন্য কাজ করে মহান এক কলামের সেট:
library(dplyr)
library(tidyr)
library(stringr)
df %>% gather(loop_number, Q3.2, starts_with("Q3.2")) %>%
mutate(loop_number = str_sub(loop_number,-2,-2)) %>%
select(id, time, loop_number, Q3.2)
id time loop_number Q3.2
1 1 2009-01-01 1 -0.20591649
2 2 2009-01-02 1 -0.19811357
3 3 2009-01-03 1 0.35147949
...
29 9 2009-01-09 3 -0.58581232
30 10 2009-01-10 3 -2.33393981
প্রত্যাশিত হিসাবে ফলস্বরূপ ডেটা ফ্রেমের 30 টি সারি রয়েছে (10 জন ব্যক্তি, প্রতিটি 3 টি লুপ)। যাইহোক, দ্বিতীয় কলামগুলির দ্বিতীয় সেট সংগ্রহ করা সঠিকভাবে কাজ করে না - এটি সফলভাবে দুটি সংযুক্ত কলাম তৈরি করে Q3.2
এবং Q3.3
30 এর পরিবর্তে 90 টি সারি দিয়ে শেষ হয় (10 ব্যক্তির সমস্ত সংমিশ্রণ, 3 টি লুপের Q3.2 এবং 3 টি লুপ) .3; সংযুক্তিগুলি প্রকৃত ডেটাতে কলামের প্রতিটি গ্রুপের জন্য যথেষ্ট পরিমাণে বৃদ্ধি করবে):
df %>% gather(loop_number, Q3.2, starts_with("Q3.2")) %>%
gather(loop_number, Q3.3, starts_with("Q3.3")) %>%
mutate(loop_number = str_sub(loop_number,-2,-2))
id time loop_number Q3.2 Q3.3
1 1 2009-01-01 1 -0.20591649 1.52718069
2 2 2009-01-02 1 -0.19811357 -0.40380049
3 3 2009-01-03 1 0.35147949 -1.02641801
...
89 9 2009-01-09 3 -0.58581232 -0.13187024
90 10 2009-01-10 3 -2.33393981 -0.48502131
gather()
সারিগুলির সঠিক সংখ্যা বজায় রেখে এই জাতীয় কলামগুলির ছোট সাবসেটগুলি একত্রিত করার জন্য এটি পছন্দ করার জন্য একাধিক কল ব্যবহার করার কোনও উপায় আছে কি ?
seperate()
Q3.3 (এবং এর বাইরে) মানগুলিকে তাদের কলামগুলিতে ভাগ করার জন্য কোনও ধরণের কল অন্তর্ভুক্ত করি । তবে এটি এখনও সত্যই চারিদিকের হ্যাকি সমাধানের মতো মনে হচ্ছে ...
spread
আমি এখন একটি সমাধান নিয়ে কাজ করছি ব্যবহার করুন: পি
df %>% gather(question_number, Q3.2, starts_with("Q3.")) %>% mutate(loop_number = str_sub(question_number,-2,-2), question_number = str_sub(question_number,1,4)) %>% select(id, time, loop_number, question_number, Q3.2) %>% spread(key = question_number, value = Q3.2)
spread()
। যদিও একাধিক কল অপরিহার্যভাবে প্রদর্শিত হয়, এটি একগুচ্ছ হোকgenerate()
কাজ করে বা নেস্টেড spread()
...
df %>% gather(loop_number, Q3.2, starts_with("Q3."))