Я думаю, что на мой вопрос довольно просто ответить, но я изучаю 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*
. Любой вклад приветствуется!
Вот способ изменить набор данных, который вы опубликовали.
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_df41368_GLM) > list_GLM<-map(list_GLM, ~spread(., predicted, y)) Error in numeric(nrowz) : invalid 'length' argument
Есть идеи? Жаль, что у меня нет опыта работы со списками.
Не уверен, потому что у меня нет данных. Вы должны определить, какой набор данных в вашем списке создает эту проблему. Начните с одного набора данных, затем проверьте 2 и т. д., пока не обнаружите проблему.
Это та проблема, когда циклы действительно весьма неэффективны. Если у вас есть несколько фреймов данных с похожими структурами и именами столбцов, лучше поместить их в список, а затем использовать
lapply()
или аналогичные функции более высокого порядка. Если имена столбцов и структура различаются, попробуйте создать пользовательскую функцию, в которой вы можете соответствующим образом настроить параметры.