Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何转换/重采样/插值数据,以便在R中具有多个分组变量的整洁数据集中归一化变量长度?_R_Dplyr_Tidyr - Fatal编程技术网

如何转换/重采样/插值数据,以便在R中具有多个分组变量的整洁数据集中归一化变量长度?

如何转换/重采样/插值数据,以便在R中具有多个分组变量的整洁数据集中归一化变量长度?,r,dplyr,tidyr,R,Dplyr,Tidyr,我的目标是规范化向量的长度,以便在整洁的数据集中进行平均。使用“近似”似乎是一种可行的方法,但我无法使它在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

我的目标是规范化向量的长度,以便在整洁的数据集中进行平均。使用“近似”似乎是一种可行的方法,但我无法使它在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()

我希望转换/重采样数据以获得每个sub_事件的var1长度,即每个id的每个事件中最长sub_事件的长度

例如,我们想要:事件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) 
#仅尝试var1
aim.df%
解组()%>%
选择(-var2)%>%
分组依据(id,事件)%>%
变异(最大子事件时间=最大子事件时间))%>%
变异(var1=近似值(var1,n=最大子事件时间)$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
mutate_impl(.data,dots)中的错误:
列“var1”的长度必须为190(组大小)或1,而不是110
此外:警告信息:
1:在if(n1)中,仅使用第一个元素
2:在序列int(x[1L],x[nx],length.out=n)中:
用于'length.out'参数的第一个元素
有什么想法吗?

步骤

  • 分组依据(id、事件、子事件)
  • 删除
    sub_event_time
    ,因为一旦添加观察值,它将不相关
  • approx
    功能的结果汇总为列表列(您必须将
    var1
    max\u sub\u event\u time
    转换为
    approx
    的适当输入)
  • unest
    结果列表列
  • group\u by(id,event,sub\u event)
    再次添加新的
    sub\u event\u 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())
    

    “var1的长度”是什么意思?组内
    var1
    的观察数?如果是,您希望添加的观察值
    var1
    的值是什么?@CJYetman:yes length of var1表示var1中的观察数(针对特定事件)。最终目的是对信号进行重采样(var1 var2)在每个事件的子事件中有相同数量的观察值;这样就可以实现每个事件的子事件变量的逐点平均值。太好了!如果我们想使用摘要对var1和var2进行分析,那么它可行吗?当然,我不明白为什么不可行
    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())