R语言 转换数据集并将列的条目汇总为一行数据

omvjsjqw  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(106)

我有一个数据集,其中包含以下形式的数据:

Name, Result, Date #A lot of other stuff as we, but these are the only relevant ones I think
Peter Parker, 150, 2018-03-03
Peter Parker, 155, 2018-03-04
Peter Parker, 156, 2018-03-05
Peter Parker, 154, 2018-03-06
Peter Parker, 158, 2018-03-07
Benny Thompson, 130, 2018-03-03
Benny Thompson, 132, 2018-03-04
Benny Thompson, 138, 2018-03-05
Benny Thompson, 140, 2018-03-07
Benny Thompson, 139, 2018-03-09
Mylo Thony, 177, 2018-03-11

有些人至少出现过5次。如果我给予前4次,我想创建一个模型,通过回归预测第5次结果。因此,我假设所有人的行为都是相同的,并想将我的数据转换为以下格式:

150, 155, 156, 154, 158
130, 132, 138, 140, 139

并且只适用于所有在记录中至少有5个结果的人,我不知道从哪里开始,我来自Java和C++部门,通常我只会在上面运行一个for循环,但这对我来说似乎非常不像R,至少我还没有见过这样的东西,什么是最好的方法来做这样的事情?

ergxz8rk

ergxz8rk1#

据我所知,必须采取以下步骤:

  • 从少于5个观察结果的参与者中删除行
  • 将数据转换为宽格式
    正在删除行

通过使用以R为基数的with函数,您可以移除观测值少于5个的参与者。

x <- data.frame(Name=c("Peter Parker", "Peter Parker", "Peter Parker", "Peter Parker","Peter Parker", "Benny Thompson", "Benny Thompson", "Benny Thompson", "Benny Thompson", "Benny Thompson", "Mylo Thony"),
           Result=c(150,155, 156, 154, 158,130, 132, 138, 140, 139, 177))
x <- x[with(x, Name %in% names(which(table(Name)>=5))), ]

转换为宽格式

您的数据当前为长格式。使用tidyr程序包中的spread函数可以轻松地将其转换为宽格式。传播函数需要包含新列名的关键字列。如果每人只有5个观测值,只要Name列中有唯一值,就可以添加一个重复数字1到5的新列(使用dplyr包中的n_distinct计算)。请注意,您的数据应同时按名称和日期排序,以便将编号分配给正确的观测。

x$Measurement <- rep(c(1,2,3,4,5), dplyr::n_distinct(x$Name))
 x_wide <- tidyr::spread(x, Measurement, Result)

如果每人的观测值超过5个,则必须修改解决方案。

6mw9ycah

6mw9ycah2#

也许"row"格式不是对数据进行预测的最佳方式,我将给出一个示例,其中dplyr/tidyr用于一行中的数据:
数据:

data <- data.frame(Name = c("Peter Parker", "Peter Parker", "Peter Parker", 
"Peter Parker", "Peter Parker", "Benny Thompson", "Benny Thompson", 
"Benny Thompson", "Benny Thompson", "Benny Thompson", "Mylo Thony"
), Result = c(150L, 155L, 156L, 154L, 158L, 130L, 132L, 138L, 
140L, 139L, 177L), Date = c(" 2018-03-03", " 2018-03-04", " 2018-03-05", 
" 2018-03-06", " 2018-03-07", " 2018-03-03", " 2018-03-04", " 2018-03-05", 
" 2018-03-07", " 2018-03-09", " 2018-03-11"))

data
#>              Name Result        Date
#> 1    Peter Parker    150  2018-03-03
#> 2    Peter Parker    155  2018-03-04
#> 3    Peter Parker    156  2018-03-05
#> 4    Peter Parker    154  2018-03-06
#> 5    Peter Parker    158  2018-03-07
#> 6  Benny Thompson    130  2018-03-03
#> 7  Benny Thompson    132  2018-03-04
#> 8  Benny Thompson    138  2018-03-05
#> 9  Benny Thompson    140  2018-03-07
#> 10 Benny Thompson    139  2018-03-09
#> 11     Mylo Thony    177  2018-03-11

过滤和转换数据的步骤

library(dplyr)
library(tidyr)

data_in_one_row <- data |> group_by(Name) |> 
  mutate(count = n(), id = 1:n()) |>
  filter(count == 5)  |>   
  pivot_wider(id_cols = c(Name), names_from = id, 
              values_from = -c(Name, id))

data_in_one_row

#> # A tibble: 2 × 16
#> # Groups:   Name [2]
#>   Name       Resul…¹ Resul…² Resul…³ Resul…⁴ Resul…⁵ Date_1 Date_2 Date_3 Date_4
#>   <chr>        <int>   <int>   <int>   <int>   <int> <chr>  <chr>  <chr>  <chr> 
#> 1 Peter Par…     150     155     156     154     158 " 201… " 201… " 201… " 201…
#> 2 Benny Tho…     130     132     138     140     139 " 201… " 201… " 201… " 201…
#> # … with 6 more variables: Date_5 <chr>, count_1 <int>, count_2 <int>,
#> #   count_3 <int>, count_4 <int>, count_5 <int>, and abbreviated variable names
#> #   ¹​Result_1, ²​Result_2, ³​Result_3, ⁴​Result_4, ⁵​Result_5

最终,您可以根据预期(在未变换的数据集上)应用单个线性模式预测。

data <- data |> group_by(Name) |> 
  mutate(count = n(), id = 1:n()) |>
  filter(count == 5) 

model <- lm(Result ~ Name + as.POSIXct(Date), data)

pred_dataset <- data |> group_by(Name) |> 
  summarise(Date = max(as.POSIXct(Date)) + 24 * 3600)

pred_dataset$prediction = predict(model, pred_dataset)

pred_dataset
#> # A tibble: 3 × 3
#>   Name           Date                prediction
#>   <chr>          <dttm>                   <dbl>
#> 1 Benny Thompson 2018-03-10 00:00:00       143.
#> 2 Mylo Thony     2018-03-12 00:00:00       179.
#> 3 Peter Parker   2018-03-08 00:00:00       159.

相关问题