簡體   English   中英

如何對R中具有多個分組變量的整潔數據集中的變量長度進行歸一化/重采樣/內插數據?

[英]How to transform/resample/interpolate data for normalising variable length within a tidy dataset with multiple grouping variables in R?

我的目標是標准化向量的長度,以便在整潔的數據集中平均。 使用“大約”似乎是一種方法,但是我無法使其在tidyverse中有效地工作。 一個問題可能與在數據框中調整大小有關。 這是一個可重現的示例:

# create reproducible dataset
i = 80
I = 110
id = rep("AA", I+i)
event = rep("event1", I+i)
sub_event = NA
sub_event[1:i] = 1
sub_event[i+1:I] = 2
sub_event = as.factor(sub_event)
y1 = sin(seq(0, 5*pi, length.out = i))
y2 = sin(seq(0, 5*pi, length.out = I))
y3 = cos(seq(0, 5*pi, length.out = i))
y4 = cos(seq(0, 5*pi, length.out = I))
var1 = c(y1,y2)
var2 = c(y3,y4)

df1 <- data.frame(id, event, sub_event,var1, var2)
df2 <- df1
df2$event = "event2"
df <- rbind(df1, df2)
temp <- df
temp$id = "BB"
df <- rbind(df, temp)


# create a "time" vector for sub_event

df <- df %>% 
  group_by(id, event, sub_event) %>%
  mutate(sub_event_time = seq_along(var1)) %>%
  select(id, event, sub_event, sub_event_time, everything()) %>%
  ungroup()

繪制var1

# plot 
ggplot(df,
       aes(x=sub_event_time, y=var1, colour = sub_event)) + 
  geom_point() +
  geom_path() +
  facet_wrap(id~event)

在此處輸入圖片說明

我希望轉換/重采樣數據以獲得每個sub_events的var1的長度,以使其成為每個id中每個事件中最長的sub_event的長度。

例如,我們想要:事件1子事件1的var1的長度=事件1子事件2的var1的長度(最長)。

這是一個嘗試:

# attempt for var1 only
aim.df <- df %>%
  ungroup() %>%
  select(-var2) %>%
  group_by(id, event) %>%
  mutate(max_sub_event_time = max(sub_event_time)) %>%
  mutate(var1 = approx(var1, n = max_sub_event_time)$y) 

這將返回以下錯誤:

    Error in mutate_impl(.data, dots) : 
    Column `var1` must be length 190 (the group size) or one, not 110
    In addition: Warning messages:
    1: In if (n <= 0) stop("'approx' requires n >= 1") :
    the condition has length > 1 and only the first element will be used
    2: In seq.int(x[1L], x[nx], length.out = n) :
    first element used of 'length.out' argument

有任何想法嗎 ?

腳步...

  1. group_by(id, event, sub_event)
  2. 刪除sub_event_time因為一旦添加觀察值,它將不再相關
  3. summarise的結果approx功能列表的列(你將不得不轉換var1max_sub_event_time為適當的輸入approx
  4. unnest結果列表列
  5. 再次group_by(id, event, sub_event)並添加一個新的sub_event_time

碼...

library(dplyr)
library(tidyr)

df %>%
  ungroup() %>%
  select(-var2) %>%
  group_by(id, event) %>%
  mutate(max_sub_event_time = max(sub_event_time)) %>% 
  group_by(id, event, sub_event) %>% 
  select(-sub_event_time) %>% 
  summarise(var1_int = list(approx(as.numeric(var1), n = first(max_sub_event_time))$y)) %>% 
  unnest() %>% 
  group_by(id, event, sub_event) %>% 
  mutate(sub_event_time = row_number())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM