2
0

mainV2.R 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. suppressMessages(library(dplyr))
  2. suppressMessages(library(stringr))
  3. WD <- getwd()
  4. specify_decimal <- function(x, k) format(round(x, k), nsmall=k)
  5. CSV <- file.choose()
  6. CSV <- read.csv(CSV)
  7. # CONVERT
  8. DATA <- NULL
  9. for(i in 1:(nrow(CSV) / 3)) {
  10. x <- NULL
  11. y <- NULL
  12. z <- NULL
  13. if(i > 1) { i <- i * 3 - 2 }
  14. x <- CSV[i,]
  15. y <- CSV[i+1,]
  16. z <- CSV[i+2,]
  17. cnv_ <- merge(x, y, all = TRUE, suffixes = c(".x", ".y"), by = "Time")
  18. cnv_ <- merge(cnv_, z, all = TRUE, suffixes = c("", ".z"), by = "Time")
  19. if(i == 1) {
  20. DATA <- cnv_
  21. }
  22. else {
  23. DATA <- bind_rows(DATA, cnv_)
  24. }
  25. }
  26. DATA$state = "UNKNOWN"
  27. remove(x)
  28. remove(y)
  29. remove(z)
  30. remove(cnv_)
  31. #Plot graph
  32. plot(DATA$Head.y,
  33. type = "l",
  34. ylab = "Hoogte hoofd"
  35. )
  36. # CALCULATE PATIENT STATE ALGORITHM
  37. STATE = c("WALK", "UP", "DOWN", "SIT")
  38. size_ <- 5
  39. differ_ <- 0.1
  40. #color <- rainbow(length(STATE))
  41. color <- c("red", "blue", "blue", "green")
  42. POINTS <- data.frame(
  43. index = integer(1)
  44. )
  45. POINTS["state"] <- 0
  46. for(i in 1:size_){
  47. POINTS[LETTERS[i]] <- 0
  48. }
  49. for(i in size_:(nrow(DATA)-size_)){
  50. start <- DATA[i,]$Head.y
  51. end <- DATA[i+size_,]$Head.y
  52. state_ <- NULL
  53. if(((start - end) < differ_) && (start - end) > -differ_){
  54. if(start >= mean(DATA$Head.y)){ #WALK (4)
  55. state_ <- 1
  56. }
  57. else{ #SIT (4)
  58. state_ <- 4
  59. }
  60. }
  61. else if((start - end) < differ_) { #UP (2)
  62. state_ <- 2
  63. }
  64. else if((start - end) > differ_) { #UP (3)
  65. state_ <- 3
  66. }
  67. else {
  68. state_ <- 1
  69. }
  70. for(j in 0:size_-1){
  71. POINTS[i-j,LETTERS[j+1]] <- state_
  72. #POINTS[i,LETTERS[j+1]] <- state_
  73. }
  74. POINTS[i,]$index <- DATA[i,]$Time
  75. if(i>size_*2 && i<=((nrow(DATA) - size_))){
  76. POINTS[i-size_,]$state <- (
  77. tbl_df(
  78. table(
  79. POINTS[i-size_,] %>%
  80. unlist(., use.names=FALSE)
  81. )
  82. ) %>%
  83. arrange(
  84. desc(n)
  85. )
  86. )[1,]$Var1
  87. }
  88. #Plot state point on graph
  89. points(i, DATA[i,]$Head.y, col = color[state_])
  90. }
  91. POINTS <- POINTS[complete.cases(POINTS),]
  92. #Check if patient is walking straight enough
  93. differ_ <- 0.4
  94. WALKING <- strtoi(rownames(POINTS[POINTS$state==1,]))
  95. start <- min(WALKING)
  96. stop <- max(WALKING)
  97. #print(mean(DATA[start:stop,]$Head.y))
  98. segments(start, mean(c(DATA[start,]$Head.y, DATA[stop,]$Head.y)), stop, col = "black")
  99. # for(i in 1:(length(WALKING)/5)-1){
  100. # if(i > 1) { i <- i * size_ - (size_-1) }
  101. # j <- i-1
  102. #
  103. #
  104. #
  105. # }
  106. base <- mean(c(DATA[start,]$Head.y, DATA[stop,]$Head.y))
  107. size_ <- 7
  108. for(i in seq(start, stop, size_)){
  109. step <- mean(DATA[i:(i+size_),]$Head.y) - base
  110. for(j in 0:(size_ -1)){
  111. if(POINTS[i+j,]$state != 1) next
  112. points(i+j, DATA[i+j,]$Head.y - step, p = "*")
  113. }
  114. }