Переупорядочивание данных для анализа GLM в R с использованием цикла for

Я думаю, что на мой вопрос довольно просто ответить, но я изучаю R, поэтому я хотел бы знать, как это сделать лучше всего.

У меня есть набор данных, выглядящий так:

> print(agg_df41367)
# A tibble: 72 x 3
# Groups:   hour [24]
    hour predicted      y
 1     0 Feeding   0.121 
 2     0 Foraging  0.632 
 3     0 Standing  0.300 
 4     1 Feeding   0.141 
 5     1 Foraging  0.727 
 6     1 Standing  0.183 
 7     2 Feeding   0.0932
 8     2 Foraging  0.817 
 9     2 Standing  0.133 
10     3 Feeding   0.214 

Я хотел бы запустить модель GLM, поэтому я хотел бы, чтобы мои данные выглядели так:

head(agg_df41361_GLM)
hour Foraging Standing Feeding 
0     0.632   0.300    0.121
1     0.727   0.183    0.141
2     0.817   0.133    0.0932
3     etc.    etc.      0.214

Любые идеи о том, что является наиболее компактным способом сделать это? В идеале я хотел бы использовать for-цикл для вычисления этого преобразования для нескольких наборов данных. Все мои наборы данных имеют формат имени agg_df4136*. Любой вклад приветствуется!

Это та проблема, когда циклы действительно весьма неэффективны. Если у вас есть несколько фреймов данных с похожими структурами и именами столбцов, лучше поместить их в список, а затем использовать lapply() или аналогичные функции более высокого порядка. Если имена столбцов и структура различаются, попробуйте создать пользовательскую функцию, в которой вы можете соответствующим образом настроить параметры.

Nautica 09.04.2019 12:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот способ изменить набор данных, который вы опубликовали.

library(tidyr)

# example data
dt = read.table(text = "
hour predicted      y
1     0 Feeding   0.121 
2     0 Foraging  0.632 
3     0 Standing  0.300 
4     1 Feeding   0.141 
5     1 Foraging  0.727 
6     1 Standing  0.183 
7     2 Feeding   0.0932
8     2 Foraging  0.817 
9     2 Standing  0.133 
", header=T)

spread(dt, predicted, y)

#   hour Feeding Foraging Standing
# 1    0  0.1210    0.632    0.300
# 2    1  0.1410    0.727    0.183
# 3    2  0.0932    0.817    0.133

Если у вас есть несколько наборов данных, лучше создать их список и применить процесс изменения формы к каждому из них:

library(tidyverse)

# example of list of dataframes
l = list(dt, dt, dt)

map(l, ~spread(., predicted, y))

# [[1]]
# hour Feeding Foraging Standing
# 1    0  0.1210    0.632    0.300
# 2    1  0.1410    0.727    0.183
# 3    2  0.0932    0.817    0.133
# 
# [[2]]
# hour Feeding Foraging Standing
# 1    0  0.1210    0.632    0.300
# 2    1  0.1410    0.727    0.183
# 3    2  0.0932    0.817    0.133
# 
# [[3]]
# hour Feeding Foraging Standing
# 1    0  0.1210    0.632    0.300
# 2    1  0.1410    0.727    0.183
# 3    2  0.0932    0.817    0.133

Обратите внимание, что здесь я использую тот же набор данных (dt), что и мои 3 элемента списка, но он будет работать с другими наборами данных, если у вас одинаковые имена столбцов.

Если вы хотите создать список всех ваших наборов данных, которые начинаются с предоставленного вами шаблона имени, вы можете сделать это:

# get objects that start with this name pattern
input_names = ls()[grepl("^agg_df4136", ls())]

# get the data that match those names
list_datasets = map(input_names, get)

Итак, list_datasets — это список всех фреймов данных в вашей среде с именем, начинающимся с «agg_df4136».

Здравствуйте, я получаю: > list_GLM = list(agg_df41361_GLM, agg_df41365_GLM, + agg_df41366_GLM,agg_df41366bis_GLM,agg_df41367_GLM,agg_df413‌​68_GLM) > list_GLM<-map(list_GLM, ~spread(., predicted, y)) Error in numeric(nrowz) : invalid 'length' argument Есть идеи? Жаль, что у меня нет опыта работы со списками.

juansalix 09.04.2019 12:55

Не уверен, потому что у меня нет данных. Вы должны определить, какой набор данных в вашем списке создает эту проблему. Начните с одного набора данных, затем проверьте 2 и т. д., пока не обнаружите проблему.

AntoniosK 09.04.2019 14:15

Другие вопросы по теме