Объедините фрейм данных, создав подмножества на основе периода времени и уникального идентификационного номера. - PullRequest
0 голосов
/ 05 марта 2020

Я ищу создание фрейма данных, в котором указан уникальный идентификатор с движением n различных сумм за период m временных шагов. В настоящее время я генерирую подмножества каждого временного шага, а затем объединяю все эти подмножества с отдельным фреймом данных, который содержит только уникальные идентификаторы. Смотрите ниже:

    set.seed(129)
df1 <- data.frame(
  id= c(rep(seq(1:7),3)),
  time= c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3),
  amount1= runif(21,0,50),
  amount2= runif(21,-20,600),
  amount3= runif(21,-15,200),
  amount4= runif(21,-3,300)
)

df2 <- data.frame(
  id = unique(df1$id)
)

sub_1 <- subset(df1, time == 1)
sub_2 <- subset(df1, time == 2)
sub_3 <- subset(df1, time == 3)

df2<-merge(df2,sub_1,by.x = "id",by.y = "id", all=TRUE)
df2<-merge(df2,sub_2,by.x = "id",by.y = "id", all=TRUE)
df2<-merge(df2,sub_3,by.x = "id",by.y = "id", all=TRUE)

#df2
      id time.x amount1.x  amount2.x  amount3.x  amount4.x time.y  amount1.y   amount2.y  amount3.y amount4.y time   amount1  amount2    amount3   amount4
    1  1      1  6.558261 -17.713007  46.477430 195.061597      2 18.5453843 269.7406808 132.588713  80.40133    3 24.943217 488.1025 103.473479 198.51302
    2  2      1 15.736044 230.018563  72.604346  -2.513162      2 48.8537058 356.5593748 161.239261 246.25985    3 35.559262 406.4749  66.278064  30.11592
    3  3      1  8.057720 386.814867 101.997370 152.269564      2  0.7334493   0.7842648  66.603965 156.12478    3 42.170220 450.0306 195.872986 109.73098
    4  4      1 15.575282 527.033563  37.403278 197.529341      2 37.8372445 370.0410836   6.074847 273.46715    3 20.302206 290.0026  -2.101649 112.88488
    5  5      1  4.230635 427.294382 112.771237 199.401096      2 15.3735066 376.8945806 104.382371 224.09730    3  8.050933 291.6123  53.660734 270.37200
    6  6      1 29.087870   9.330858 129.400932  70.801129      2 38.9966662 421.9258798  -3.891286 290.59259    3 17.919554 581.1735 137.100314 129.78561
    7  7      1  4.380303 463.658580   4.120219  56.527016      2  6.0582455 484.4981686  67.820164  72.05615    3 43.556746 170.0745  41.134708 247.99512

У меня есть серьезная проблема с этим, так как значения m и n увеличиваются, этот метод становится уродливым и длинным. Есть ли более чистый способ сделать это? Может быть, как один вкладыш, так что мне не нужно говорить 15 подмножеств, если m = 15.

Спасибо

1 Ответ

2 голосов
/ 05 марта 2020

Вам просто нужен ваш исходный набор данных df1 и сделайте следующее:

library(tidyverse)

df1 %>%
  group_split(time) %>%        # create your subsets and store them as a list of data frames
  reduce(left_join, by = "id") # sequentially join those subsets
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...