লজিকাল ভেক্টরে সত্যিকারের মানগুলি কীভাবে গণনা করা যায়


160

আর-তে, TRUEএকটি লজিকাল ভেক্টরের মান সংখ্যা গণনা করার সবচেয়ে দক্ষ / প্রতিচ্ছবিটি কী? আমি দুটি উপায় সম্পর্কে চিন্তা করতে পারি:

z <- sample(c(TRUE, FALSE), 1000, rep = TRUE)
sum(z)
# [1] 498

table(z)["TRUE"]
# TRUE 
#  498 

আপনি কোনটি পছন্দ করেন? আরও ভাল কিছু আছে কি?

উত্তর:


174

লজিকাল ভেক্টরটিতে NAমান রয়েছে এমন কিছু সমস্যা রয়েছে ।
উদাহরণস্বরূপ দেখুন:

z <- c(TRUE, FALSE, NA)
sum(z) # gives you NA
table(z)["TRUE"] # gives you 1
length(z[z == TRUE]) # f3lix answer, gives you 2 (because NA indexing returns values)

সুতরাং আমি মনে করি নিরাপদটি ব্যবহার করা na.rm = TRUE:

sum(z, na.rm = TRUE) # best way to count TRUE values

(যা দেয় 1) আমি মনে করি যে tableসমাধানটি কম কার্যকর ( tableফাংশনের কোডটি দেখুন )।

এছাড়াও, আপনার যদি "টেবিল" সমাধানটি সম্পর্কে সতর্কতা অবলম্বন করা উচিত, যদি লজিকাল ভেক্টরটিতে কোনও সত্য মান থাকে না। ধরুন z <- c(NA, FALSE, NA)বা সহজভাবে z <- c(FALSE, FALSE), তারপর উভয় ক্ষেত্রে table(z)["TRUE"]আপনাকে দেয় NA


table(c(FALSE))["TRUE"]এনএ, 0
দিচ্ছে

@ ইউসিসি ফারজৌন হ্যাঁ, এবং এটি আমার উত্তরে রয়েছে। এটি উদাহরণস্বরূপ কেন এটি কাজ করবে না। আমার sollution হয়sum(z, na.rm = TRUE)
Marek

84

অন্য একটি বিকল্প যা উল্লেখ করা হয়নি তা হ'ল which:

length(which(z))

কেবলমাত্র "যা দ্রুত প্রশ্ন" তে কিছু প্রসঙ্গ সরবরাহ করতে কেবল নিজের পরীক্ষা করা সর্বদা সহজ। তুলনা করার জন্য আমি ভেক্টরটিকে অনেক বড় করে তুলেছি:

z <- sample(c(TRUE,FALSE),1000000,rep=TRUE)
system.time(sum(z))
   user  system elapsed 
   0.03    0.00    0.03
system.time(length(z[z==TRUE]))
   user  system elapsed 
   0.75    0.07    0.83 
system.time(length(which(z)))
   user  system elapsed 
   1.34    0.28    1.64 
system.time(table(z)["TRUE"])
   user  system elapsed 
  10.62    0.52   11.19 

সুতরাং স্পষ্টভাবে ব্যবহার sumকরা এই ক্ষেত্রে সেরা পন্থা। NAমারেকের পরামর্শ অনুসারে আপনি মানগুলিও যাচাই করতে চাইতে পারেন ।

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

> which(c(T, F, NA, NULL, T, F))
[1] 1 4
> which(!c(T, F, NA, NULL, T, F))
[1] 2 5

নোট করুন যা কেবলমাত্র যৌক্তিকর জন্য পরীক্ষা করে TRUE, তাই এটি মূলত অ-যৌক্তিক মানগুলিকে উপেক্ষা করে।


বিটিডাব্লু, ডার্কের
মেরেক

12

আরেকটি উপায়

> length(z[z==TRUE])
[1] 498

যদিও আমার sum(z) জন্য সুন্দর এবং সংক্ষিপ্তlength(z[z==TRUE]) কাছে আরও বেশি স্ব-ব্যাখ্যা করা। যদিও, আমি মনে করি এটি একটি সাধারণ কাজ দিয়ে এটি সত্যিই কোনও পার্থক্য করে না ...

যদি এটি একটি বড় ভেক্টর হয়, আপনার সম্ভবত দ্রুততম সমাধানটি নেওয়া উচিত, যা sum(z)length(z[z==TRUE])প্রায় 10x ধীর এবং table(z)[TRUE]প্রায় 200x ধীরsum(z)

সামিং আপ, sum(z)টাইপ করা এবং সম্পাদন করার জন্য দ্রুত।


6

whichভাল বিকল্প, বিশেষত যখন আপনি ম্যাট্রিকগুলিতে পরিচালনা করেন (তর্কটি পরীক্ষা করে দেখুন ?whichএবং লক্ষ্য করুন arr.ind)। তবে আমি প্রস্তাব দিই যে আপনি যুক্তিযুক্ত ভেক্টরটিকে পরিচালনা করতে পারে এমন যুক্তিটির sumকারণে আপনি এটির সাথে লেগে থাকুন। এই ক্ষেত্রে:na.rmNA

# create dummy variable
set.seed(100)
x <- round(runif(100, 0, 1))
x <- x == 1
# create NA's
x[seq(1, length(x), 7)] <- NA

আপনি যদি টাইপ করেন তবে ফল sum(x)পাবেন NAতবে আপনি na.rm = TRUEযদি sumকার্যক্রমে পাস করেন তবে আপনি যা চান ফলাফল পাবেন।

> sum(x)
[1] NA
> sum(x, na.rm=TRUE)
[1] 43

আপনার প্রশ্নটি কি কঠোরভাবে তাত্ত্বিক, বা আপনার যৌক্তিক ভেক্টর সম্পর্কিত কিছু ব্যবহারিক সমস্যা আছে?


আমি একটি কুইজ গ্রেড করার চেষ্টা করছিলাম। একটি প্রয়োগের মধ্যে যোগফল (youranswer == ডানদিকের মালিক) এর মতো কিছু করা।
জ্যোতির্ময় ভট্টাচার্য

আমার উত্তরটি খুব দীর্ঘ, সুতরাং আমি একটি নতুন উত্তর পোস্ট করেছি, কারণ এটি আগের উত্তর থেকে পৃথক।
aL3xa

6

আরেকটি বিকল্প হ'ল সংক্ষিপ্তসার ফাংশন ব্যবহার করা। এটি Ts, Fs এবং NA এর সংক্ষিপ্তসার দেয়।

> summary(hival)
   Mode   FALSE    TRUE    NA's 
logical    4367      53    2076 
> 

1
উপরন্তু, কেবল "সত্য" ফলাফল পেতে (যা একটি স্ট্রিং হিসেবে আউটপুট হবে, কিন্তু অন্তর্ভুক্ত "সত্য" আউটপুটে): summary(hival)["TRUE"];
মাইকেল 25

0

আমি কয়েক সপ্তাহ আগে অনুরূপ কিছু করছি। এখানে একটি সম্ভাব্য সমাধান, এটি স্ক্র্যাচ থেকে লেখা হয়েছে, সুতরাং এটি বিটা-রিলিজ বা এটির মতো কিছু। আমি কোড থেকে লুপগুলি সরিয়ে এটিকে উন্নত করার চেষ্টা করব ...

মূল ধারণাটি হ'ল একটি ফাংশন লিখুন যা 2 (বা 3) টি আর্গুমেন্ট নেবে। প্রথমটি হ'ল data.frameযা প্রশ্নাবলীর থেকে সংগৃহীত ডেটা ধারণ করে এবং দ্বিতীয়টি সঠিক উত্তর সহ একটি সংখ্যাসূচক ভেক্টর (এটি কেবলমাত্র একক পছন্দ সম্পর্কিত প্রশ্নপত্রের জন্য প্রযোজ্য)। বিকল্পভাবে, আপনি তৃতীয় যুক্তি যুক্ত করতে পারেন যা চূড়ান্ত স্কোর সহ সংখ্যক ভেক্টর, বা এম্বেডড স্কোর সহ ডেটা.ফ্রেমে ফিরে আসবে।

fscore <- function(x, sol, output = 'numeric') {
    if (ncol(x) != length(sol)) {
        stop('Number of items differs from length of correct answers!')
    } else {
        inc <- matrix(ncol=ncol(x), nrow=nrow(x))
        for (i in 1:ncol(x)) {
            inc[,i] <- x[,i] == sol[i]
        }
        if (output == 'numeric') {
            res <- rowSums(inc)
        } else if (output == 'data.frame') {
            res <- data.frame(x, result = rowSums(inc))
        } else {
            stop('Type not supported!')
        }
    }
    return(res)
}

আমি কিছু * প্লাই ফাংশন দিয়ে আরও মার্জিত উপায়ে এটি করার চেষ্টা করব। লক্ষ্য করুন যে আমি na.rmযুক্তি রাখিনি ... তা করবে

# create dummy data frame - values from 1 to 5
set.seed(100)
d <- as.data.frame(matrix(round(runif(200,1,5)), 10))
# create solution vector
sol <- round(runif(20, 1, 5))

এখন একটি ফাংশন প্রয়োগ করুন:

> fscore(d, sol)
 [1] 6 4 2 4 4 3 3 6 2 6

যদি আপনি ডেটা.ফ্রেমে যুক্তিটি পাস করেন তবে এটি পরিবর্তিত ডেটা.ফ্রেমে ফিরে আসবে। আমি এটিকে ঠিক করার চেষ্টা করব ... আশা করি এটি সাহায্য করবে!


6
এক-লাইনের: rowSums(t(t(d)==sol), na.rm=TRUE)। তুলনার জন্য রিসাইকেল ভেক্টর। যদি আপনার dকলামগুলিতে ম্যাট্রিক্স থাকে তবে এটি সরল হয় rowSums(d==sol, na.rm=TRUE)
মারেক

0

আমার সবেমাত্র একটি বিশেষ সমস্যা হয়েছে যেখানে আমাকে একটি লজিকাল ভেক্টর থেকে সত্য বিবৃতি গণনা করতে হয়েছিল এবং এটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে ...

length(grep(TRUE, (gene.rep.matrix[i,1:6] > 1))) > 5

সুতরাং এটি জিন.রেপ.ম্যাট্রিক্স অবজেক্টের একটি উপসেট গ্রহণ করে এবং লজিকাল ভেক্টরকে ফিরিয়ে একটি যৌক্তিক পরীক্ষা প্রয়োগ করে। এই ভেক্টরটিকে গ্রেপ হিসাবে আর্গুমেন্ট হিসাবে রাখা হয়েছে, যা কোনও সত্যের প্রবেশের অবস্থানগুলি ফিরিয়ে দেয়। দৈর্ঘ্য তারপরে কতগুলি এন্ট্রি গ্রেপকে খুঁজে বের করে তা গণনা করে, সুতরাং সত্যিকারের প্রবেশের সংখ্যা দেয়।


0

একটি প্যাকেজ নামেও রয়েছে bitযা বিশেষত দ্রুত বুলিয়ান ক্রিয়াকলাপগুলির জন্য ডিজাইন করা হয়েছে। এটি বিশেষত কার্যকর যদি আপনার কাছে বড় ভেক্টর থাকে বা অনেকগুলি বুলিয়ান অপারেশন করতে হয়।

z <- sample(c(TRUE, FALSE), 1e8, rep = TRUE)

system.time({
  sum(z) # 0.170s
})

system.time({
  bit::sum.bit(z) # 0.021s, ~10x improvement in speed
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.