studio seleccionar filas eliminar datos data contar condicion concatenar con columnas r count col

seleccionar - eliminar na en r



Contar el número de columnas por una condición(>) para cada fila (3)

Estoy intentando calcular para cada fila de una matriz cuántas columnas tienen valores superiores a un valor específico. Lamento que haga esta simple pregunta, pero no pude resolverlo.

He extraído valores de temperatura máximos de una pila de ráster, de varios años de rásteres, para algunos puntos espaciales que me interesan. Los datos son similares a los siguientes:

data <- cbind(''1990'' = c(25, 22, 35, 42, 44), ''1991'' = c(23, 28, 33, 40, 45), ''1992'' = c(20, 20, 30, 41, 43)) 1990 1991 1992 1 25 23 20 2 22 28 20 3 35 33 30 4 42 40 41 5 44 45 43

Quiero terminar con la cantidad de años que la temperatura estuvo por encima de 30 para cada ubicación, por ejemplo:

yr.above 1 0 2 0 3 2 4 3 5 3

He intentado algunas cosas, pero no funcionaron y fueron bastante ilógicas (por ejemplo, tratando de longitud (datos [1: longitud (datos), que (bla, bla, no tiene sentido)), o aplicar (datos, 1, longitud (datos)> 30), sé que estos no tienen sentido, pero estoy un poco atascado.


El tercer argumento de aplicar debe ser una función. Además, puedes contar trues lógicos con suma.

apply(data, 1, function(x)sum(x > 30))


Esto le dará el vector que está buscando:

rowSums(data > 30)

Funcionará si los data son una matriz o un data.frame. Además, usa funciones vectorizadas, por lo tanto, es un enfoque preferido sobre el uso de apply que es poco más que un bucle for (lento).

Si los data son un data.frame, puede agregar el resultado como una columna haciendo:

data$yr.above <- rowSums(data > 30)

o si los data son una matriz:

data <- cbind(data, yr.above = rowSums(data > 30))

También puedes crear un data.frame completamente nuevo:

data.frame(yr.above = rowSums(data > 30))

o una matriz completamente nueva:

cbind(yr.above = rowSums(data > 30))


También podemos hacer con Reduce y + (suponiendo que no haya elementos NA)

Reduce(`+`, lapply(as.data.frame(data), `>`, 30))

Esto debería ser eficiente ya que no estamos convirtiendo a una matrix .