首页 > 解决方案 > 使用 for 循环在 R 中重新安排 GLM 分析的数据

问题描述

我认为我的问题很容易回答,但我正在学习 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-loop 来计算多个数据集的这种转换。我所有的数据集都遵循名称格式agg_df4136*。任何输入表示赞赏!

标签: rfor-loop

解决方案


这是一种重塑您发布的数据集的方法。

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”开头的所有数据帧的列表。


推荐阅读