Tenho um conjunto de dados (conjunto de dados fictício abaixo). Preciso ampliá-lo, mas também criar uma lista com cada nível por "Bloco".
Block<-c("a1","a1","a1","a1","a1","b1","b1","b1","b1") #2 block
Species<-c("c","c","c","d","d","c","e","c","e")
date<-c("2021-03-29","2021-03-30","2021-03-28","2021-03-30","2021-03-29",
"2021-03-29","2021-03-29","2021-03-28","2021-03-28")
df<-data.frame(Block, Species, date)
Abaixo está o resultado que estou tentando obter. Sei como fazer isso se eu extrair cada bloco individualmente, ampliar o zoom e combinar cada um em uma lista. No entanto, na realidade, tenho um conjunto de dados muito maior, com mais datas, espécies e blocos, então não quero fazer isso manualmente. Existe uma maneira mais eficiente de fazer isso? Muito obrigado.
$a1
2021-03-28 2021-03-29 2021-03-30
c 1 1 1
d 0 1 1
$b1
2021-03-28 2021-03-29
c 1 1
e 1 1
Você está procurando por
ou
que corresponde à sua representação desejada: nomeado
list
dedata.frames
.Observação. Muitas vezes, não queremos nomes de colunas como "
`2021-03-28` `2021-03-29` `2021-03-30`
e informações importantes como nomes de linhas""c" "d" "e"
. A modificação é direta e bons exemplos de "R forçando tabela a um quadro de dados" são fáceis de encontrar.Dá:
Supondo que os números sejam contagens de Espécies por data , use
lapply
edata.frame
para obter o formato desejado com nomes de linhas de Espéciessaída
ou (dependendo de quantos blocos são criados, pode ter menos desempenho porque
pivot_wider
precisa ser aplicado várias vezes ao bloco )saída
Dados
(ligeiramente modificado para obter contagens > 1)
As pessoas sempre esquecem a função fácil
tapply
:Os dados utilizados são apresentados na Nota no final.
1) dplyr/tidyr Adicione uma coluna de 1s, classifique os dados e aninhe-os
Block
para que adata
coluna seja uma lista de tibbles. Gire os tibbles individuais usandopivot_wider
e extraia adata
coluna resultante.dando:
1a) Esta variação que também usa
map
from purrr é uma alternativa.2) Base R: Adicione uma
value
coluna e classifique, resultando emdf2
. Em seguida, para cada bloco, apliquereshape
a conversão de formato longo para formato largo, corrija os nomes e substitua os NAs por 0s.2a) Se for aceitável ter uma lista de matrizes de classe "xtabs" em vez de quadros de dados, podemos simplificar isso para:
3) Matriz 3D Se você quiser considerar outras representações, podemos converter
df
para uma matriz 3D como esta:dando
Observação
A pergunta se refere a
Site
, mas não o define, então omitimos essa coluna e também a definição dedf
"refere-se a"datetime
e presumimos que o que se queria dizer era,date
já que não hádatetime
definição. Assim, usamos isso paradf
Dados reproduzíveis: