Разделить — применить — объединить
Типичная задача в анализе данных — разбить фрейм данных на группы, применить преобразование к каждой группе, а затем снова объединить части в один фрейм. Этот подход настолько распространён в R, что получил собственное название: split-apply-combine («разделить — применить — объединить»). В курсе Intermediate R for Finance вы подробнее познакомитесь с такими задачами и полезными функциями для их решения. А пока разберём простой пример.
Предположим, что для фрейма данных cash вам нужно удвоить значение cash_flow для компании A и утроить — для компании B:
grouping <- cash$company
split_cash <- split(cash, grouping)
# Обратиться к столбцу cash_flow каждого элемента списка можно так:
split_cash$A$cash_flow
[1] 1000 4000 550
split_cash$A$cash_flow <- split_cash$A$cash_flow * 2
split_cash$B$cash_flow <- split_cash$B$cash_flow * 3
new_cash <- unsplit(split_cash, grouping)
Обратите внимание на обращение к столбцу cash_flow. Первый знак $ позволяет получить элемент A из списка split_cash. Второй знак $ — обратиться к столбцу cash_flow фрейма данных, хранящегося в элементе A.
Это упражнение является частью курса
Введение в R для финансов
Инструкции к упражнению
- Фрейм данных
split_cashуже доступен в среде. Также доступна переменнаяgrouping, использовавшаяся для разбиенияcash. - Выведите
split_cash, чтобы изучить структуру списка. - Выведите столбец
cash_flowдля компанииBизsplit_cash. - Предположим, что компания A прекратила деятельность. Установите значение
cash_flowдля компании A равным0. - С помощью
groupingпримените функциюunsplit()к фрейму данныхsplit_cash. Сохраните результат в переменнуюcash_no_A. - Выведите
cash_no_A, чтобы проверить изменённый фрейм данных.
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
# Print split_cash
# Print the cash_flow column of B in split_cash
split_cash$___$___
# Set the cash_flow column of company A in split_cash to 0
split_cash$___$___ <- ___
# Use the grouping to unsplit split_cash
cash_no_A <- unsplit(___, ___)
# Print cash_no_A