Как применять операторы if, когда условие берется из другого фрейма данных, но с общей переменной - PullRequest
0 голосов
/ 19 марта 2019

У меня есть пустой фрейм истории встреч со всеми нулями.Я хочу заполнить его значением «1», где происходит встреча в конкретном году.

Мой файл данных (файл данных) выглядит примерно так:

Date               Name
2007-04-28          a
2007-05-19          a
2007-05-21          b                
2008-04-28          a
2009-05-06          c  

И «пустой» фрейм данных (встреча), который необходимо перекодировать

Name  2007   2008   2009   2010
a      0      0      0      0
b      0      0      0      0
c      0      0      0      0
d      0      0      0      0
e      0      0      0      0

Я пытался использовать оператор if:

datafile$Date%>%if(datafile$Date==between(01-01-07&31-12-07)) {encounter$2007=="1"}

Но получил ошибку

Error in between(1 - 1 - 7 & 31 - 12 - 7) : 
  between has been x of type logical
In addition: Warning message:
In if (.) datafile$Date == between(1 - 1 - 7 & 31 - 12 - 7) else { :
  the condition has length > 1 and only the first element will be used

1 Ответ

1 голос
/ 19 марта 2019

Есть много способов сделать то, что, как вы сказали, вам нужно. (Данные полностью внизу.)

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...