2016-11-06 5 views
-1

У меня есть матрица, подобная следующей, которая имеет суммарную сумму случайных значений.Пронумеруйте строки и сохраните значения столбцов меньше случайного значения. R

dist<-.25 
mat<-matrix(data=runif(150,25,55)*dist, nrow = 500,ncol=150) 
mat = t(apply(mat, 1, cumsum)) 

и то, что я хотел бы сделать, это:

Для каждой строки генерирует новое случайное значение

RV<-runif(1,1,800) 

и для всех столбцов в этой строке меньше, чем «RV» делают их = "na". Я также хотел бы сохранить (cbind) случайное значение «RV» для каждой строки

В конце я хотел бы получить матрицу (или dataframe), где первый столбец представляет собой случайное значение «RV», сгенерированное для каждой строки, и все столбцы в этой строке имеют значения меньше «RV» или в противном случае «na»

У меня есть идея, как определить правильные значения для 1 строки за раз, но я не могу понять, как это сделать это с применением функций. Возможно, мне придется цикл это, но мой реальный набор данных имеет около 100000 строк, поэтому я хотел бы избежать для цикла, если это возможно

Y<-data.frame(mat) 
Y[1, which(Y[1,1:150]< RV)] 

Я думал, что это будет легко, но совершенно в тупик. Любые идеи будут высоко оценили

+0

Ваш пример не воспроизводимым без редактирования, и не ясно, что вы хотите, чтобы вывод выглядеть. Не могли бы вы пересмотреть? – ulfelder

+0

@ulfelder Извините, теперь должно быть лучше. Надеюсь, что это делает проблему более ясной. – Jdan

ответ

2

Вот решение, используя применять:

mat2 <- apply(mat, 
       MARGIN = 1, 
       function(x) { 
       zx <- runif(1,1,800) 
       x[x > zx] <- NA 
       return(append(zx, x)) 
       }) 

mat2 <- t(mat2) 
+0

Спасибо, это здорово. Просто интересно, что делает Margin = 1 часть? – Jdan

+0

@Jdan 'margin' сообщает' apply' как выполнять итерацию по матрице. Значение 1 будет выполнять по строкам, а 2 - по столбцам. Выполнить 'mat <- matrix (1: 9, nrow = 3); печать (мат); apply (мат, MARGIN = 1, FUN = сумма); примените (мат, MARGIN = 2, FUN = sum) ', чтобы увидеть разницу. – Zach

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