2015-01-06 4 views
1

Пусть говорят Я кадр данных состоит из одной переменной (х)для цикла и хранения результатов в массиве в R

df <- data.frame(x=c(1,2,3,3,5,6,7,8,9,9,4,4)) 

Я хочу знать, сколько чисел меньше, чем 2,3, 4,5,6,7. Я знаю, как это сделать вручную с помощью

# This will tell you how many numbers in df less than 4 
xnew <- length(df[ which(df$x < 4), ]) 

Мой вопрос, как я могу автоматизировать этот процесс, используя для цикла или другого метода (ов)? И мне нужно, чтобы сохранить результаты в массиве следующим

i length 
2 1 
3 2 
4 4 
5 6 
6 7 
7 8 

Благодарности

ответ

3

Одним из способов было бы перебрать (sapply) чисел (2:7), проверьте, какие элементы в df$x меньше (<) «номер» и сделать sumcbind, с номерами, даст matrix выхода

res <- cbind(i=2:7, length=sapply(2:7, function(y) sum(df$x <y))) 

Или вы можете векторизации по CRE ating matrix номеров (2:7) с каждым числом, реплицированным на количество строк df, выполните логическую операцию < с df$x. Логическая операция повторяется для каждого столбца матрицы и получает суммы столбцов с использованием colSums.

length <- colSums(df$x <matrix(2:7, nrow=nrow(df), ncol=6, byrow=TRUE)) 

#or 
#length <- colSums(df$x < `dim<-`(rep(2:7,each=nrow(df)),c(12,6))) 
cbind(i=2:7, length=length) 
+0

Спасибо, но как я могу хранить i, тоже? i = 2,3,4,5,6,7. – user9292

1
num = c(2,3,4,5,6,7) 
res = sapply(num, function(u) length(df$x[df$x < u])) 

data.frame(number=num, 
      numberBelow=res) 
1

Векторизованное решение:

findInterval(2:7*(1-.Machine$double.eps),sort(df$x)) 

.Machine$double.eps часть гарантирует, что вы принимаете только цифры ниже, чем и не ниже или равно.

Смежные вопросы