আর-তে ভেক্টরগুলির তালিকা থেকে আমি কীভাবে ম্যাট্রিক্স তৈরি করব?


102

লক্ষ্য: সমান দৈর্ঘ্যের ভেক্টরগুলির তালিকা থেকে একটি ম্যাট্রিক্স তৈরি করুন যেখানে প্রতিটি ভেক্টর সারি হয়ে যায়।

উদাহরণ:

> a <- list()
> for (i in 1:10) a[[i]] <- c(i,1:5)
> a
[[1]]
[1] 1 1 2 3 4 5

[[2]]
[1] 2 1 2 3 4 5

[[3]]
[1] 3 1 2 3 4 5

[[4]]
[1] 4 1 2 3 4 5

[[5]]
[1] 5 1 2 3 4 5

[[6]]
[1] 6 1 2 3 4 5

[[7]]
[1] 7 1 2 3 4 5

[[8]]
[1] 8 1 2 3 4 5

[[9]]
[1] 9 1 2 3 4 5

[[10]]
[1] 10  1  2  3  4  5

আমি চাই:

      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5 

উত্তর:


124

একটি বিকল্প ব্যবহার করা হয় do.call():

 > do.call(rbind, a)
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

5
সুতরাং এই এবং স্ট্যান্ডার্ড rbind () এর মধ্যে পার্থক্যটি হল যে do.call () প্রতিটি তালিকা আইটেমকে পৃথক যুক্তি হিসাবে পাস করে - এটি কি ঠিক? do.call (rbind, a) rbind (a [[1]], a [[2]] ... a [[10]]) এর সমান?
ম্যাট পার্কার

5
do.call () এই উদ্দেশ্যে দুর্দান্ত, আমি আশা করি প্রবর্তক উপকরণগুলিতে এটি আরও ভাল "নথিভুক্ত" হত।
অ্যান্ড্রুজ

16

simplify2arrayএকটি বেস ফাংশন যা মোটামুটি স্বজ্ঞাত। তবে, যেহেতু আর-এর ডিফল্ট হ'ল প্রথমে কলাম দ্বারা ডেটা পূরণ করা উচিত, আপনার আউটপুট স্থানান্তর করতে হবে। ( sapplyব্যবহার simplify2array, যেমন নথি হিসাবে help(sapply)।)

> t(simplify2array(a))
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

12

সোজা না, তবে এটি কাজ করে:

> t(sapply(a, unlist))
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

1
সঙ্গে rjsonফলাফল, colMeansশুধুমাত্র এই পদ্ধতির জন্য কাজ করে! ধন্যবাদ!
এমপিওউ

10

অন্তর্নির্মিত matrixফাংশনটিতে ডেটা প্রবেশের দুর্দান্ত বিকল্প রয়েছে byrowunlistআপনার উত্স তালিকার সাথে এটি একত্রিত করুন যা আপনাকে একটি ম্যাট্রিক্স দেবে। আমাদের সারিগুলির সংখ্যাও উল্লেখ করতে হবে যাতে এটি তালিকাভুক্ত ডেটা ভাঙতে পারে। এটাই:

> matrix(unlist(a), byrow=TRUE, nrow=length(a) )
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    1    2    3    4    5
 [2,]    2    1    2    3    4    5
 [3,]    3    1    2    3    4    5
 [4,]    4    1    2    3    4    5
 [5,]    5    1    2    3    4    5
 [6,]    6    1    2    3    4    5
 [7,]    7    1    2    3    4    5
 [8,]    8    1    2    3    4    5
 [9,]    9    1    2    3    4    5
[10,]   10    1    2    3    4    5

বা কলাম দ্বারা একটি ম্যাট্রিক্স পূরণ করুন এবং তারপর জায়গা বদল করুন: t( matrix( unlist(a), ncol=length(a) ) )
কালিন

8
t(sapply(a, '[', 1:max(sapply(a, length))))

যেখানে 'এ' একটি তালিকা। অসম সারির আকারের জন্য কাজ করবে


3
> library(plyr)
> as.matrix(ldply(a))
      V1 V2 V3 V4 V5 V6
 [1,]  1  1  2  3  4  5
 [2,]  2  1  2  3  4  5
 [3,]  3  1  2  3  4  5
 [4,]  4  1  2  3  4  5
 [5,]  5  1  2  3  4  5
 [6,]  6  1  2  3  4  5
 [7,]  7  1  2  3  4  5
 [8,]  8  1  2  3  4  5
 [9,]  9  1  2  3  4  5
[10,] 10  1  2  3  4  5

1
সারিগুলির একই দৈর্ঘ্য না থাকলে এটি কেবল কাজ করবে না, যখন do.call (rbind, ...) এখনও কাজ করে।
rwst

অনুপস্থিত সারি ডেটার জন্য এটি এনএ দিয়ে অসম সারি আকারের জন্য কীভাবে কাজ করবে তা কোনও সূত্র?
অরিহন্ত

1
@rwst আসলে, do.call (rbind, ...) অসম দৈর্ঘ্যের ভেক্টরগুলির জন্য কাজ করে না, যদি না আপনি শেষে সারিটি পূরণ করার সময় ভেক্টরটিকে পুনরায় ব্যবহার করার ইচ্ছা না করেন nd NAপরিবর্তে শেষে মানগুলি পূরণ করার জন্য অরিহন্তের প্রতিক্রিয়া দেখুন ।
কালিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.