如何在均匀的时间内将数据拆分为4组?

时间:2015-07-14 12:27:00

标签: r if-statement split

此数据框是在2个不同条件下对11名受试者进行视频分析的结果:守夜与视频。我有启动和停止列,其中时间以秒为单位。我按主题(sbj)和认知负荷(条件)对数据进行分组,然后通过减去每个条件的每个主题的最后停止时间和第一个开始时间来找到每个视频的时间量。然后我将视频的总时间除以4,看看每个四分位数的长度(以秒为单位)。下面是数据的示例,尽管我的实际数据有点复杂:

library(dplyr)
start <- c(35, 44, 53, 62, 71, 80)
stop <- c(42, 50, 59, 70, 77, 85)
condition <- c('video', 'vigil', 'video', 'vigil', 'video', 'vigil')
sbj <- c(1, 1, 2, 2, 3, 3)
df <- data.frame(start, stop, condition, sbj)
df1 <- group_by(df, sbj, condition)
df2 <- summarize(df1, time = last(stop)-first(start))
hd2 <- transform(df2, quartile = time/4)
hd3 <- inner_join(df1, hd2)
hd3
 start stop condition sbj time quartile
1    35   42     video   1    7     1.75
2    44   50     vigil   1    6     1.50
3    53   59     video   2    6     1.50
4    62   70     vigil   2    8     2.00
5    71   77     video   3    6     1.50
6    80   85     vigil   3    5     1.25 

我想将数据分成4组,其中每组等于整个视频时间(四分位数)的1/4的长度。由于每个视频的开始时间不是0秒(对于主题1,你可以看到它从35秒开始),我需要将每个条件下每个主题的第一个起始值添加到四分位数的值以获得适当的时间占整个视频的1/4。我尝试了一个ifelse语句,但最终的答案非常粗略地分解了四分位数。

attach(hd3)
fx <- first(start) + quartile
hd3$Q <- with(hd3, ifelse(start <= fx, 1, 
ifelse(start <= fx * 2, 2, 
ifelse(start <= fx * 3, 3,
ifelse(start <= fx * 4, 4)))))

我希望有人可以建议一种更优雅,更正确地分割四分位数的方法。提前谢谢!

1 个答案:

答案 0 :(得分:1)

好的,我已经编辑了我的答案,现在提供经过测试的代码。

您提供的数据应该具有每conditionsbj多个行,以使结果更有趣。

library(dplyr)

start <- c(35, 44, 53, 62, 71, 80, 87, 90)
stop <- c(42, 50, 59, 70, 77, 85, 89, 95)
condition <- c('video', 'vigil', 'video', 'vigil', 'video', 'vigil', 'video', 'vigil')
sbj <- c(1, 1, 1, 1, 2, 2, 2, 2)
df <- data.frame(start, stop, condition, sbj)
df1 <- group_by(df, sbj, condition)

df1$med <- with(df1, (start + stop)/2)
df4 <- summarize(df1, 
  min = first(start), 
  range = last(stop)-first(start)
  )
hd4 <- inner_join(df1, df4)
hd4$quant <- with(hd4, (med-min)/range)
hd4$group <-  cut(hd4$quant, breaks=seq(0, 1, length=5), 
  include.lowest=TRUE, labels=FALSE)