Как посчитать количество упорядоченных последовательностей в векторе в R - PullRequest
1 голос
/ 04 апреля 2020

В качестве примера приведены следующие данные.

Data<-c("a","d","c","b","d","a","d","b","c","b","a","b","d","c","b","a","c","d","d","c")

Мне нужно выяснить, сколько раз a Я создал al oop (используя 4 функции IF), но это занимает много времени, когда у нас большой набор данных. С этим l oop ответ 47 раз.

Есть ли эффективный способ сделать это в R.

Вот моя попытка, но она очень медленная, когда говорят, что у нас более 4 букв и большой набор данных.


Data<-c("a","d","c","b","d","a","d","b","c","b","a","b","d","c","b","a","c","d","d","c")
set.seed(123)
Data0<-sort(sample(1:100,20))

df<-data.frame(Data,Data0)

A<-df[Data=="a",2]
B<-df[Data=="b",2]
C<-df[Data=="c",2]
D<-df[Data=="d",2]


myfun<-function(A,B,C,D){
b0<-0
f0<-0
for (i in 1:length(A)){
for (j in 1:length(B)){
for (k in 1:length(C)){
for (l in 1:length(D)){

f0<-f0+sum(A[i]<B[j])*sum(B[j]<C[k])*sum(C[k]<D[l])

}}}}

return(f0)
}


myfun(A,B,C,D)

Большое спасибо

1 Ответ

1 голос
/ 05 апреля 2020

Вы можете использовать split для деления Data0 на группы, т.е. Data, создавать все возможные комбинации, используя expand.grid и подсчитывать количество раз a < b < c < d.

temp <- do.call(expand.grid, split(df$Data0, df$Data))
sum(with(temp, a < b & b < c & c < d))
#[1] 47

Если есть много столбцов, и мы не хотим проверять это вручную, мы можем использовать apply и для каждой строки проверять разницу между последовательными элементами с diff и подсчитывать количество вхождений, когда all значения выше, чем предыдущие значения ,

sum(apply(temp, 1, function(x) all(diff(x) > 0)))
#[1] 47
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...