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