Итерация цикла for над группами в наборе данных - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь применить цикл for к набору данных.Цикл должен генерировать последовательность для определенного (неравного) числа строк, а затем начинать сначала.Я могу сгруппировать эти строки.Мне удалось написать цикл, который работает для первой из моих групп, но затем останавливается (также выдает кучу предупреждений, «числовое выражение имеет 226 элементов: используется только первый»).Я понял, что это только перебор первой группы, но затем значения, из которых состоит новая переменная, которую я создаю с этим циклом, меняются, и она падает.Может кто-нибудь мне помочь?Я ужасно воссоздаю набор данных, извините!

start <- c(1901, 1902, 1950, 1980, 1980)
end <- c(1905, 1910, 1951, 1999, 1985)
year <- NA
group <- c("apples","apples","apples", "Banana","cherry")
df <- data.frame(start, end, year, group)
df$count <- df$end - df$start
df<- df[rep(rownames(df), df$count +1), ]

Это мой цикл:

for(i in row_along(df)){
df$year[[i]] <- rep(df$start:df$end)[i]
}

Я хочу, чтобы каждая строка имела значение "год" между началом и концом (для каждого года одна строка с одинаковыми значениями, кроме года).У меня неравное количество строк (даты начала и окончания), в зависимости от двух других переменных.Группировка с помощью dplyr не является проблемой, мне удается составить список фреймов данных (с разделением), но это все.Я застрял.

На всякий случай

row_along <- function(df) seq(nrow(df))

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Другим вариантом будет цикл по соответствующим элементам 'start', 'end' с map2 (из purrr), получение последовательности в list и затем unnest

library(tidyverse)
df %>% 
    mutate(year = map2(start, end, `:`)) %>% 
    unnest
0 голосов
/ 13 февраля 2019

Я думаю, это то, что вы хотите:

library(dplyr)
df %>% group_by(start, end) %>%
  mutate(year = start[1]:end[1])
# # A tibble: 42 x 5
# # Groups:   start, end [5]
#    start   end  year group  count
#    <dbl> <dbl> <int> <fct>  <dbl>
#  1  1901  1905  1901 apples     4
#  2  1901  1905  1902 apples     4
#  3  1901  1905  1903 apples     4
#  4  1901  1905  1904 apples     4
#  5  1901  1905  1905 apples     4
#  6  1902  1910  1902 apples     8
#  7  1902  1910  1903 apples     8
#  8  1902  1910  1904 apples     8
#  9  1902  1910  1905 apples     8
# 10  1902  1910  1906 apples     8
# # ... with 32 more rows

В вашей попытке у вас есть df$start:df$end.df$start - это вектор, весь столбец всех начальных значений, и то же самое для df$end, поэтому вы получаете предупреждения: в то время как 1901:1905 четко определено, c(1901, 1901, 1901):c(1905, 1905, 1905) нет, и предупреждение говоритВы, что только первый элемент на каждой стороне используется.Вот почему я использую start[1]:end[1] в ответе. Внутри каждой группы нам нужно рассмотреть только первые значения start и end, чтобы сгенерировать полную последовательность year.(Ваша попытка также имела проблему, заключающуюся в том, что она ничего не сделала с группами --- dplyr облегчает группировку.)

...