Есть много способов сделать то, что, как вы сказали, вам нужно. (Данные полностью внизу.)
library(dplyr)
datafile %>%
transmute(Year = format(Date, "%Y"), Name) %>%
xtabs(data = ., ~ Name + Year)
# Year
# Name 2007 2008 2009
# a 2 1 0
# b 1 0 0
# c 0 0 1
, хотя это создает объект класса "xtabs" "table"
, а не фрейм. Для этого вы можете использовать:
library(tidyr)
encounters <- datafile %>%
transmute(Year = format(Date, "%Y"), Name) %>%
group_by(Year, Name) %>%
tally() %>%
tidyr::spread(Year, n) %>%
mutate_at(vars(-Name), ~ replace(., is.na(.), 0))
encounters
# # A tibble: 3 x 4
# Name `2007` `2008` `2009`
# <chr> <dbl> <dbl> <dbl>
# 1 a 2 1 0
# 2 b 1 0 0
# 3 c 0 0 1
Некоторые проблемы с вашим кодом.
Я думаю, вы собираетесь передать столбец Date
в between
, поэтому что-то вроде этого может быть ближе к тому, что вы пытаетесь сделать:
datafile$Date %>%
between(as.Date("2007-01-01"), as.Date("2007-12-31"))
# [1] TRUE TRUE TRUE FALSE FALSE
Но это не помогает нам присвоить конкретное значение. Это не позволяет сразу назначать новые значения обратно в фрейм, но, по крайней мере, я могу помочь вам исправить использование between
.
Кроме того, оператор / функция %>%
передает данные вперед, она не позволяет сразу назначать их в другом месте. Вы можете подделать это, но я не думаю, что так оно и было задумано. И так как этот условный вектор создается из datafile
(который является одной «формой»), и вы хотите присвоить значения в encounters
(который является совершенно другой «формой»), вы столкнетесь с логическими проблемами, которые действительно лучше чтобы избежать.
Данные:
datafile <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
Date Name
2007-04-28 a
2007-05-19 a
2007-05-21 b
2008-04-28 a
2009-05-06 c')
datafile$Date <- as.Date(datafile$Date)