Puede agregar una columna a sus datos utilizando varias técnicas. Las citas siguientes provienen de la sección "Detalles" del texto de ayuda correspondiente [[.data.frame
.
Los marcos de datos se pueden indexar en varios modos. Cuando [
y [[
se utilizan con un índice de vector único ( x[i]
o x[[i]]
), indexan el marco de datos como si fuera una lista.
my.dataframe["new.col"] <- a.vector
my.dataframe[["new.col"]] <- a.vector
El método data.frame para $
, trata x
como una lista
my.dataframe$new.col <- a.vector
Cuando [
y [[
se utilizan con dos índices ( x[i, j]
y x[[i, j]]
) actúan como indexando una matriz
my.dataframe[ , "new.col"] <- a.vector
Dado que el método para data.frame
asume que si no especifica si está trabajando con columnas o filas, asumirá que se refiere a columnas.
Para su ejemplo, esto debería funcionar:
# make some fake data
your.df <- data.frame(no = c(1:4, 1:7, 1:5), h_freq = runif(16), h_freqsq = runif(16))
# find where one appears and
from <- which(your.df$no == 1)
to <- c((from-1)[-1], nrow(your.df)) # up to which point the sequence runs
# generate a sequence (len) and based on its length, repeat a consecutive number len times
get.seq <- mapply(from, to, 1:length(from), FUN = function(x, y, z) {
len <- length(seq(from = x[1], to = y[1]))
return(rep(z, times = len))
})
# when we unlist, we get a vector
your.df$group <- unlist(get.seq)
# and append it to your original data.frame. since this is
# designating a group, it makes sense to make it a factor
your.df$group <- as.factor(your.df$group)
no h_freq h_freqsq group
1 1 0.40998238 0.06463876 1
2 2 0.98086928 0.33093795 1
3 3 0.28908651 0.74077119 1
4 4 0.10476768 0.56784786 1
5 1 0.75478995 0.60479945 2
6 2 0.26974011 0.95231761 2
7 3 0.53676266 0.74370154 2
8 4 0.99784066 0.37499294 2
9 5 0.89771767 0.83467805 2
10 6 0.05363139 0.32066178 2
11 7 0.71741529 0.84572717 2
12 1 0.10654430 0.32917711 3
13 2 0.41971959 0.87155514 3
14 3 0.32432646 0.65789294 3
15 4 0.77896780 0.27599187 3
16 5 0.06100008 0.55399326 3
Fácilmente: su marco de datos es A
Entonces obtienes la columna b.
fuente
cumsum(b) -> b
el resultado, se agregue directamente como una columna al marco de datos original, algo así comoA$groups <- cumsum(b)
.cumsum(b)
le dará un vector de longitud 3, o me falta algo?your.df
datos, simplemente puede haceryour.df$group = cumsum(your.df[, 1]==1)
para obtener su nueva columna de grupo.Si entiendo la pregunta correctamente, desea detectar cuándo
h_no
no aumenta y luego aumentarclass
. (Voy a explicar cómo resolví este problema, hay una función autónoma al final).Trabajando
Solo nos importa la
h_no
columna por el momento, por lo que podemos extraer eso del marco de datos:Queremos detectar cuándo
h_no
no sube, lo que podemos hacer calculando cuándo la diferencia entre los elementos sucesivos es negativa o cero. R proporciona ladiff
función que nos da el vector de diferencias:Una vez que tenemos eso, es muy sencillo encontrar los que no son positivos:
En R,
TRUE
yFALSE
son básicamente lo mismo que1
y0
, por lo que si obtenemos la suma acumulada denonpos
, aumentará en 1 en (casi) los puntos apropiados. Lacumsum
función (que es básicamente lo contrario dediff
) puede hacer esto.Pero hay dos problemas: los números son demasiado pequeños; y nos falta el primer elemento (debería haber cuatro en la primera clase).
El primer problema se resuelve simplemente:
1+cumsum(nonpos)
. Y el segundo solo requiere agregar un1
al frente del vector, ya que el primer elemento siempre está en la clase1
:Ahora, podemos adjuntarlo nuevamente a nuestro marco de datos con
cbind
(usando laclass=
sintaxis, podemos darle a la columna elclass
encabezado):Y
data_w_classes
ahora contiene el resultado.Resultado final
Podemos comprimir las líneas juntas y envolverlo todo en una función para que sea más fácil de usar:
O, dado que tiene sentido
class
que sea un factor:Utiliza cualquiera de las funciones como:
(Este método para resolver este problema es bueno porque evita la iteración explícita, que generalmente se recomienda para R, y evita generar muchos vectores intermedios y listas, etc. Y también es bastante bueno cómo se puede escribir en una línea :))
fuente
Además de la respuesta de Roman, algo como esto podría ser aún más simple. Tenga en cuenta que no lo he probado porque no tengo acceso a R en este momento.
La función itera sobre los valores
n_ho
y siempre devuelve la categoría a la que pertenece el valor actual. Si1
se detecta un valor de , aumentamos la variable globalindex
y continuamos.fuente
Creo que usar "cbind" es la forma más sencilla de agregar una columna a un marco de datos en R. A continuación, se muestra un ejemplo:
fuente
fuente
Enfoque basado en la identificación del número de grupos (
x
pulgadasmapply
) y su longitud (y
pulgadasmapply
)fuente