使用for循环

时间:2019-04-09 10:20:18

标签: r for-loop

我认为我的问题很容易回答,但是我正在学习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*。任何输入表示赞赏!

1 个答案:

答案 0 :(得分: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

请注意,这里我使用与3个列表元素相同的数据集(dt),但是只要您具有相同的列名,它就可以与其他数据集一起使用。

如果要创建以您提供的名称模式开头的所有数据集的列表,可以执行以下操作:

# 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”开头。