#r #dataframe
Вопрос:
В R у меня есть очень длинный фрейм данных, в котором есть два столбца следующим образом:
вверх | низкий |
---|---|
5 | 10 |
10 | 20 |
20 | 30 |
NA | NA |
NA | NA |
NA | NA |
NA | NA |
NA | Na |
NA | NA |
Я хотел бы повторить последовательность чисел в этих двух столбцах до конца кадра данных. Итак, мой желаемый стол должен выглядеть так:
вверх | низкий |
---|---|
5 | 10 |
10 | 20 |
20 | 30 |
5 | 10 |
10 | 20 |
20 | 30 |
5 | 10 |
10 | 20 |
20 | 30 |
Как я могу это сделать в R? Какие коды можно использовать для этого? Пожалуйста, помогите мне. Спасибо
Комментарии:
1. Что определяет последовательность? Всегда ли это просто последовательность цифр до первого NA? Могут ли длины последовательностей отличаться между двумя столбцами?
Ответ №1:
вот tidyverse
подход, использующий purrr
:
purrr::map_dfr(seq_len(3), ~df) %gt;% na.omit()
up low 1 5 10 2 10 20 3 20 30 10 5 10 11 10 20 12 20 30 19 5 10 20 10 20 21 20 30
Ответ №2:
Как насчет репликации фрейма данных без NAs, т. Е.
sapply(na.omit(df),rep.int,times=(nrow(df) / nrow(na.omit(df)))) # v1 v2 # [1,] 5 10 # [2,] 10 20 # [3,] 20 30 # [4,] 5 10 # [5,] 10 20 # [6,] 20 30 # [7,] 5 10 # [8,] 10 20 # [9,] 20 30
Ответ №3:
Я бы использовал rep
и row.names
:
gt; df[rep(row.names(na.omit(df)), nrow(df) / nrow(na.omit(df))),] up low 1 5 10 2 10 20 3 20 30 1.1 5 10 2.1 10 20 3.1 20 30 1.2 5 10 2.2 10 20 3.2 20 30 gt;
Чтобы сбросить индекс:
out lt;- df[rep(row.names(na.omit(df)), nrow(df) / nrow(na.omit(df))),] row.names(out) lt;- NULL
gt; out up low 1 5 10 2 10 20 3 20 30 4 5 10 5 10 20 6 20 30 7 5 10 8 10 20 9 20 30 gt;