ম্যাট্রিক্স বা ডেটা ফ্রেমের প্রতিটি সারিতে একটি ফাংশন প্রয়োগ করুন


129

ধরুন আমার কাছে একটি বাই ম্যাট্রিক্স এবং একটি ফাংশন রয়েছে যা এটির একটি আর্গুমেন্ট হিসাবে একটি 2-ভেক্টর নেয়। আমি ম্যাট্রিক্সের প্রতিটি সারিতে ফাংশনটি প্রয়োগ করতে এবং একটি এন-ভেক্টর পেতে চাই। আর এ কীভাবে করবেন?

উদাহরণস্বরূপ, আমি 2 ডি স্ট্যান্ডার্ড সাধারণ বিতরণের ঘনত্বটি তিনটি পয়েন্টে গণনা করতে চাই:

bivariate.density(x = c(0, 0), mu = c(0, 0), sigma = c(1, 1), rho = 0){
    exp(-1/(2*(1-rho^2))*(x[1]^2/sigma[1]^2+x[2]^2/sigma[2]^2-2*rho*x[1]*x[2]/(sigma[1]*sigma[2]))) * 1/(2*pi*sigma[1]*sigma[2]*sqrt(1-rho^2))
}

out <- rbind(c(1, 2), c(3, 4), c(5, 6))

প্রতিটি সারিতে ফাংশনটি কীভাবে প্রয়োগ করবেন out?

আপনার নির্দিষ্টভাবে ফাংশনটির পয়েন্টগুলি ছাড়াও অন্যান্য যুক্তিগুলির জন্য মানগুলি কীভাবে পাস করবেন?

উত্তর:


180

আপনি কেবল apply()ফাংশনটি ব্যবহার করুন :

R> M <- matrix(1:6, nrow=3, byrow=TRUE)
R> M
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
R> apply(M, 1, function(x) 2*x[1]+x[2])
[1]  4 10 16
R> 

এটি একটি ম্যাট্রিক্স নেয় এবং প্রতিটি সারিতে একটি (মূর্খ) ফাংশন প্রয়োগ করে। আপনি ফাংশনটিতে চতুর্থ, পঞ্চম, ... যুক্তি হিসাবে অতিরিক্ত যুক্তিগুলি পাস করেন apply()


ধন্যবাদ! ম্যাট্রিক্সের সারিগুলি যদি ফাংশনের প্রথম আর্গ না হয় তবে কী হবে? ম্যাট্রিক্সের প্রতিটি সারিতে ফাংশনটির কোন আর্গটি নির্দিষ্ট করা যায়?
টিম

এর জন্য apply()সহায়তাটি পড়ুন - এটি সারি দিয়ে ঝাপিয়ে যায় (যখন দ্বিতীয় আরগটি 1 হয়, অন্য কলাম দ্বারা) এবং বর্তমান সারিটি (বা কর্নেল) সর্বদা প্রথম যুক্তি। বিষয়গুলি এভাবেই সংজ্ঞায়িত করা হয়।
ডার্ক এডেলবুয়েটেল

@Tim: আপনি একটি অভ্যন্তরীণ আর ফাংশন ব্যবহার এবং সারি প্রথম ARG নয়, কি হিসাবে ডির্ক করেনি এবং আপনার নিজস্ব ফাংশন করতে যেখানে সারি হয় প্রথম ARG।
জোরিস মাইস

3
প্লাইর প্যাকেজটি এগুলি প্রয়োগ করে বিভিন্ন ধরণের ফাংশন সরবরাহ করে। এটি সমান্তরাল প্রক্রিয়াকরণ সহ আরও কার্যকারিতা সরবরাহ করে।
পল হিমস্ট্র্রা

6
@ cryptic0 এই উত্তরটি দেরিতে, তবে গুগলারের ক্ষেত্রে প্রয়োগের ক্ষেত্রে দ্বিতীয় যুক্তিটি হ'ল MARGINযুক্তি। এখানে এর অর্থ সারিগুলিতে ফাংশনটি প্রয়োগ করুন (এর মধ্যে প্রথম মাত্রা dim(M))। যদি এটি 2 হয়, এটি কলামগুলিতে ফাংশনটি প্রয়োগ করবে।
ডি নোভো

17

আপনি যদি সাধারণ ক্রিয়া যেমন সমষ্টি বা গড় প্রয়োগ করতে চান তবে আপনার ব্যবহার করা উচিত rowSumsবা rowMeansযেহেতু সেগুলি apply(data, 1, sum)পদ্ধতির চেয়ে দ্রুত faster অন্যথায়, সাথে থাকা apply(data, 1, fun)। আপনি FUN যুক্তির পরে অতিরিক্ত আর্গুমেন্টগুলি পাস করতে পারেন (ডার্ক ইতিমধ্যে প্রস্তাবিত হিসাবে):

set.seed(1)
m <- matrix(round(runif(20, 1, 5)), ncol=4)
diag(m) <- NA
m
     [,1] [,2] [,3] [,4]
[1,]   NA    5    2    3
[2,]    2   NA    2    4
[3,]    3    4   NA    5
[4,]    5    4    3   NA
[5,]    2    1    4    4

তারপরে আপনি এর মতো কিছু করতে পারেন:

apply(m, 1, quantile, probs=c(.25,.5, .75), na.rm=TRUE)
    [,1] [,2] [,3] [,4] [,5]
25%  2.5    2  3.5  3.5 1.75
50%  3.0    2  4.0  4.0 3.00
75%  4.0    3  4.5  4.5 4.00

15

এখানে একটি ম্যাট্রিক্সের প্রতিটি সারিতে একটি ফাংশন প্রয়োগ করার একটি সংক্ষিপ্ত উদাহরণ রয়েছে। (এখানে, প্রয়োগ করা ফাংশনটি প্রতিটি সারিতে 1 এ স্বাভাবিক হয়))

নোট: থেকে ফলাফলের apply()করা হয়েছিল পক্ষান্তরিত ব্যবহার t()ইনপুট ম্যাট্রিক্স হিসাবে একই বিন্যাস পেতে A

A <- matrix(c(
  0, 1, 1, 2,
  0, 0, 1, 3,
  0, 0, 1, 3
), nrow = 3, byrow = TRUE)

t(apply(A, 1, function(x) x / sum(x) ))

ফলাফল:

     [,1] [,2] [,3] [,4]
[1,]    0 0.25 0.25 0.50
[2,]    0 0.00 0.25 0.75
[3,]    0 0.00 0.25 0.75

6

প্রথম পদক্ষেপটি ফাংশনটি অবজেক্ট তৈরি করা হবে, তারপরে এটি প্রয়োগ করা হবে। আপনি যদি কোনও ম্যাট্রিক্স অবজেক্ট চান যাতে একই সংখ্যক সারি রয়েছে, আপনি এটি পূর্বনির্ধারিত করতে পারেন এবং চিত্রিত হিসাবে অবজেক্ট [] ফর্মটি ব্যবহার করতে পারেন (অন্যথায় প্রত্যাবর্তিত মানটি একটি ভেক্টরকে সরল করা হবে):

bvnormdens <- function(x=c(0,0),mu=c(0,0), sigma=c(1,1), rho=0){
     exp(-1/(2*(1-rho^2))*(x[1]^2/sigma[1]^2+
                           x[2]^2/sigma[2]^2-
                           2*rho*x[1]*x[2]/(sigma[1]*sigma[2]))) * 
     1/(2*pi*sigma[1]*sigma[2]*sqrt(1-rho^2))
     }
 out=rbind(c(1,2),c(3,4),c(5,6));

 bvout<-matrix(NA, ncol=1, nrow=3)
 bvout[] <-apply(out, 1, bvnormdens)
 bvout
             [,1]
[1,] 1.306423e-02
[2,] 5.931153e-07
[3,] 9.033134e-15

আপনি যদি নিজের ডিফল্ট প্যারামিটারগুলি ছাড়া অন্য ব্যবহার করতে চান তবে ফাংশনের পরে কলটিতে নামযুক্ত যুক্তিগুলি অন্তর্ভুক্ত করা উচিত:

bvout[] <-apply(out, 1, FUN=bvnormdens, mu=c(-1,1), rho=0.6)

প্রয়োগ () উচ্চতর মাত্রিক অ্যারেতেও ব্যবহার করা যেতে পারে এবং মার্গিন আর্গুমেন্ট একটি ভেক্টর পাশাপাশি একক পূর্ণসংখ্যারও হতে পারে।


4

প্রয়োগ ভাল কাজ করে, কিন্তু বেশ ধীর। স্যাপ্লি এবং ভ্যাপ্লি ব্যবহার করা কার্যকর হতে পারে। dplyr এর সারি দিকটিও কার্যকর হতে পারে আসুন কোনও ডেটা ফ্রেমের সারিওয়ালা পণ্য কীভাবে করা যায় তার একটি উদাহরণ দেখি।

a = data.frame(t(iris[1:10,1:3]))
vapply(a, prod, 0)
sapply(a, prod)

নোট করুন যে ভ্যাপ্লি / স্যাপ্লি / অ্যাপ্লিকেশন ব্যবহারের আগে ভেরিয়েবলকে অর্পণ করা ভাল অনুশীলন কারণ এটি অনেক সময় হ্রাস করে। মাইক্রোব্যাঙ্কমার্কের ফলাফল দেখুন see

a = data.frame(t(iris[1:10,1:3]))
b = iris[1:10,1:3]
microbenchmark::microbenchmark(
    apply(b, 1 , prod),
    vapply(a, prod, 0),
    sapply(a, prod) , 
    apply(iris[1:10,1:3], 1 , prod),
    vapply(data.frame(t(iris[1:10,1:3])), prod, 0),
    sapply(data.frame(t(iris[1:10,1:3])), prod) ,
    b %>%  rowwise() %>%
        summarise(p = prod(Sepal.Length,Sepal.Width,Petal.Length))
)

কীভাবে টি () ব্যবহৃত হচ্ছে তা সাবধানতার সাথে দেখুন


আপনি যদি ব্যবহার করেন b <- t(iris[1:10, 1:3])এবং ব্যবহার করেন তবে পরিবারের প্রয়োগের তুলনা করা আরও ন্যায্য হতে পারে apply(b, 2 prod)
দাস্পিগ

2

আপনি যদি একক মানের পরিবর্তে ডেটাসেটের বিবিধ অংশ ব্যবহার করতে চান তবে অন্য একটি পদ্ধতির ব্যবহার হ'ল rollapply(data, width, FUN, ...)। প্রস্থের ভেক্টর ব্যবহার করে আপনাকে ডেটাসেটের বিবিধ উইন্ডোতে কোনও ফাংশন প্রয়োগ করতে দেয়। আমি এটি একটি অভিযোজিত ফিল্টারিং রুটিন তৈরি করতে ব্যবহার করেছি, যদিও এটি খুব দক্ষ নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.