Você pode adicionar uma coluna aos seus dados usando várias técnicas. As citações abaixo vêm da seção "Detalhes" do texto de ajuda relevante [[.data.frame
,.
Os quadros de dados podem ser indexados em vários modos. Quando [
e [[
são usados com um único índice vetorial ( x[i]
ou x[[i]]
), eles indexam o quadro de dados como se fosse uma lista.
my.dataframe["new.col"] <- a.vector
my.dataframe[["new.col"]] <- a.vector
O método data.frame para $
, trata x
como uma lista
my.dataframe$new.col <- a.vector
Quando [
e [[
são usados com dois índices ( x[i, j]
e x[[i, j]]
) eles agem como indexar uma matriz
my.dataframe[ , "new.col"] <- a.vector
Visto que o método para data.frame
assume que se você não especificar se está trabalhando com colunas ou linhas, ele assumirá que você quer dizer colunas.
Para o seu exemplo, isso deve 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
Facilmente: seu quadro de dados é A
Então você obtém a coluna b.
fonte
cumsum(b) -> b
o resultado, fosse adicionado diretamente como uma coluna ao quadro de dados original, algo comoA$groups <- cumsum(b)
.cumsum(b)
fornecerá um vetor de comprimento 3 ou estou faltando alguma coisa?your.df
dados, você pode simplesmente fazeryour.df$group = cumsum(your.df[, 1]==1)
para obter sua nova coluna de grupo.Se entendi a pergunta corretamente, você deseja detectar quando o
h_no
não aumenta e, em seguida, incrementa oclass
. (Vou explicar como resolvi esse problema, há uma função independente no final.)Trabalhando
No
h_no
momento, só nos importamos com a coluna, então podemos extraí-la do quadro de dados:Queremos detectar quando
h_no
não sobe, o que podemos fazer calculando quando a diferença entre os elementos sucessivos é negativa ou zero. R fornece adiff
função que nos dá o vetor de diferenças:Assim que tivermos isso, é uma questão simples encontrar os que não são positivos:
Em R,
TRUE
eFALSE
são basicamente iguais a1
e0
, portanto, se obtermos a soma cumulativa denonpos
, aumentará em 1 nos (quase) pontos apropriados. Acumsum
função (que é basicamente o oposto dediff
) pode fazer isso.Mas, há dois problemas: os números são muito pequenos; e, está faltando o primeiro elemento (deve haver quatro na primeira aula).
O primeiro problema é simplesmente resolvido:
1+cumsum(nonpos)
. E o segundo requer apenas a adição de um1
à frente do vetor, já que o primeiro elemento está sempre na classe1
:Agora, podemos anexá-lo de volta ao nosso quadro de dados com
cbind
(usando aclass=
sintaxe, podemos dar à coluna oclass
título ):E
data_w_classes
agora contém o resultado.Resultado final
Podemos compactar as linhas e agrupar tudo em uma função para torná-lo mais fácil de usar:
Ou, uma vez que faz sentido
class
que seja um fator:Você usa uma das funções como:
(Este método de resolver este problema é bom porque evita a iteração explícita, que geralmente é recomendada para R, e evita a geração de muitos vetores intermediários e listas etc. E também é bem legal como pode ser escrito em uma linha :))
fonte
Além da resposta de Roman, algo assim pode ser ainda mais simples. Observe que não testei porque não tenho acesso ao R no momento.
A função itera sobre os valores em
n_ho
e sempre retorna a categoria à qual o valor atual pertence. Se um valor de1
for detectado, aumentamos a variável globalindex
e continuamos.fonte
Acredito que usar "cbind" é a maneira mais simples de adicionar uma coluna a um quadro de dados em R. Abaixo um exemplo:
fonte
fonte
Abordagem baseada na identificação do número de grupos (
x
inmapply
) e seu comprimento (y
inmapply
)fonte