#r #matrix #rows
#r #матрица #строки
Вопрос:
Найдите количество записей в каждой строке, которые больше 4.
set.seed(75)
aMat <- matrix( sample(10, size=60, replace=T), nr=6)
rowmax=function(a)
{
x=nrow(a)
y=ncol(a)
i=1
j=1
z=0
while (i<=x) {
for(j in 1:y) {
if(!is.na(a[i][j])){
if(a[i][j]>4){
z=z 1
}
}
j=j 1
}
print(z)
i=i 1
}
}
rowmax(aMat)
Он показывает ошибку. Я не хочу применять встроенную функцию
Ответ №1:
Вы могли бы сделать это проще, подсчитав x
, что больше, чем 4
использовать length
.
rowmax2 <- function(x) apply(x, 1, function(x) {x <- na.omit(x);length(x[x > 4])})
rowmax2(aMat)
# [1] 8 7 8 7 4 3
Ответ №2:
Если вы хотите сделать это абсолютно без каких-либо ярлыков, вы можете использовать два for
цикла. по 1 для каждой строки и по одному для каждого значения в строке.
rowmax = function(a) {
y=nrow(a)
result <- numeric(y)
for(j in seq_len(y)) {
count = 0
for(val in a[j, ]) {
if(!is.na(val) amp;amp; val > 4)
count = count 1
}
result[j] <- count
}
return(result)
}
rowmax(aMat)
#[1] 8 7 8 7 4 3
Если вы хотите сделать это с помощью встроенных функций в базе R, вы могли бы использовать rowSums
.
rowSums(aMat > 4, na.rm = TRUE)
#[1] 8 7 8 7 4 3
Ответ №3:
В вашем коде есть несколько ошибок:
- Вы должны поместить
z <- 0
внутреннийwhile
цикл - Вы должны использовать
a[i,j]
для индексации матрицы, а неa[i][j]
Ниже приведена версия после устранения проблем
rowmax <- function(a) {
x <- nrow(a)
y <- ncol(a)
i <- 1
j <- 1
while (i <= x) {
z <- 0
for (j in 1:y) {
if (!is.na(a[i, j])) {
if (a[i, j] > 4) {
z <- z 1
}
}
j <- j 1
}
print(z)
i <- i 1
}
}
и тогда мы получаем
> rowmax(aMat)
[1] 8
[1] 7
[1] 8
[1] 7
[1] 4
[1] 3
Краткий подход к его созданию заключается в использовании rowSums
, например,
rowSums(aMat, na.rm = TRUE)