2016-05-19 18 views
0

Ich habe einen Datensatz, der die vertikale Bodenreaktionskraft für zwei vertikale Sprünge von einem Athleten zur Verfügung gestellt enthält. Dies ist eine kontinuierliche Variable. Ich habe auch eine Spalte, die die Verschiebung des Athleten angibt, die auch eine kontinuierliche Variable ist. Die Daten werden bei 500 Hz für beide Sprünge abgetastet, aber Sprung Nr. 1 benötigt mehr Zeit als Sprung Nr. 2, daher hat sie eine größere Anzahl von Reihen.Zeit normalize eine Sprungkraft Variable in R

Ich möchte die Verschiebung von jedem Sprung auf einer Skala von 0 bis 100% der Gesamtverschiebung normalisieren, um die Kraftvariable für beide Sprünge auf gleiche Länge zu bringen. Ich möchte dann die mittlere Kraft-gegen-Verschiebungskurven-Durchschnitt über die Sprünge berechnen.

Da der Datensatz ziemlich lang ist, habe ich ein verkürztes Beispiel, wie die Daten derzeit existieren, und wie ich möchte, dass es am Ende aussieht. Ich hoffe, dass jemand in der Lage ist, einen guten Ansatz zur Normalisierung der Verschiebung auf einer Skala von 0 bis 100% bereitzustellen und sicherzustellen, dass die Anzahl der Reihen für jeden Sprung gleich ist.

Hinweis: Im folgenden Code habe ich eine Abtastfrequenz von 10 Hz gewählt, um zu verdeutlichen, wie die Daten auf einfache Art und Weise aufgebaut werden, so dass ich einen Rat zu meiner Vorgehensweise erhalten kann.

Aktuelle Rohdatenstruktur:

Jump_Number  Displacement Force Time 
    1    0   800  0 
    1    -0.10   700  0.1 
    1    -0.29   500  0.2 
    1    -0.40   200  0.3 
    1    -0.45   100  0.4 
    1    -0.50   500  0.5 
    1    -0.30   800  0.6 
    1    -0.10   1200  0.7 
    1    -0.05   1300  0.8 
    1    0.05   1250  0.9 
    2    0   800  0.0 
    2    -0.10   678  0.1 
    2    -0.29   499  0.2 
    2    -0.40   178  0.3 
    2    -0.45   90  0.4 
    2    -0.50   600  0.5 
    2    -0.40   810  0.6 
    2    -0.35   999  0.7 
    2    -0.29   1135  0.8 
    2    -0.10   1250  0.9 
    2    -0.05   1401  1.0 
    2    0.05   1345  1.1 

Wunsch normalisierte Datenstruktur:

Jump_Number  Normalized_Displacement_(%) Force  
    1      0     800  
    1     10     700  
    1     20     500  
    1     30     200  
    1     40     100  
    1     50     500  
    1     60     800  
    1     70     1200  
    1     80     1300  
    1     90     1289 
    1     100     1250  
    2     0      800  
    2     10      678  
    2     20      499  
    2     30      178  
    2     40      90   
    2     50      600  
    2     60      810  
    2     70      999  
    2     80      1135  
    2     90      1250  
    2     100      1345  
+0

Es ist nicht ganz klar, warum Sie resultierende Spalte „normalisierten Verschiebung“ nennen, es sei denn, Werte in gewünschte Ergebnis nicht dem Beispiel entsprechen. Ich würde denken, dass die Normalisierung wie folgt durchgeführt werden kann: '(Verschiebung - min)/Bereich * 100'. – Bulat

Antwort

0

Ich gehe davon aus, dass Sie nicht wirklich die Kräfte erwarten entsprechend der „normalisierten Verschiebung "gleich zu denen für die ursprünglichen Verschiebungen. Mit dieser Annahme können Sie das folgende Skript verwenden, um die Daten zu erzeugen, die Sie benötigen.

require(ggplot2) 

# Read the data 
jump_names = c("Jump_Number", "Displacement", "Force", "Time") 
jump_data = transpose(data.frame(
    c(1, 0, 800, 0), 
    c(1, -0.10, 700, 0.1), 
    c(1, -0.29, 500, 0.2), 
    c(1, -0.40, 200, 0.3), 
    c(1, -0.45, 100, 0.4), 
    c(1, -0.50, 500, 0.5), 
    c(1, -0.30, 800, 0.6), 
    c(1, -0.10, 1200, 0.7), 
    c(1, -0.05, 1300, 0.8), 
    c(1, 0.05, 1250, 0.9), 
    c(2, 0, 800, 0.0), 
    c(2, -0.10, 678, 0.1), 
    c(2, -0.29, 499, 0.2), 
    c(2, -0.40, 178, 0.3), 
    c(2, -0.45, 90, 0.4), 
    c(2, -0.50, 600, 0.5), 
    c(2, -0.40, 810, 0.6), 
    c(2, -0.35, 999, 0.7), 
    c(2, -0.29, 1135, 0.8), 
    c(2, -0.10, 1250, 0.9), 
    c(2, -0.05, 1401, 1.0), 
    c(2, 0.05, 1345, 1.1))) 
names(jump_data) = jump_names 
jump_data$Jump_Number = as.factor(jump_data$Jump_Number) 

# Compute percent displacement 
jump_data$Total_Displacement = ave(abs(jump_data$Displacement), jump_data$Jump_Number, FUN = cumsum) 
jump_data$Max_Displacement = ave(abs(jump_data$Total_Displacement), jump_data$Jump_Number, FUN = max) 
jump_data$Percent_Displacement = jump_data$Total_Displacement/jump_data$Max_Displacement*100 

# Split the data 
jump_data_split = split(jump_data, jump_data$Jump_Number) 

# Apply interpolation and the combine 
interp_data = data.frame() 
for (ii in 1:length(jump_data_split)) { 
    linear_interp = data.frame(approx(jump_data_split[[ii]]$Percent_Displacement, 
       jump_data_split[[ii]]$Force, 
       xout = seq(0, 100, by = 10), 
       method = "linear")) 
    linear_interp$Jump_Number = paste0(ii, "interp") 
    interp_data = rbind(interp_data, linear_interp) 
} 
interp_data$Jump_Number = as.factor(interp_data$Jump_Number) 
names(interp_data) = c("Percent_Displacement", "Force", "Jump_Number") 

# Plots 
plt = ggplot(jump_data, 
      aes(x = Time, y = -Displacement, 
       color = Jump_Number, group = Jump_Number)) + 
     geom_path() + 
     theme_bw() 
print(plt) 
dev.copy(png, "disp_time.png") 
dev.off() 

dev.new() 
plt0 = ggplot(jump_data, 
      aes(x = Time, y = Total_Displacement, 
       color = Jump_Number, group = Jump_Number)) + 
     geom_path() + 
     theme_bw() 
print(plt0) 
dev.copy(png, "tot_disp_time.png") 
dev.off() 

dev.new() 
plt1 = ggplot(jump_data, 
      aes(x = Time, y = Force, 
       color = Jump_Number, group = Jump_Number)) + 
     geom_path() + 
     theme_bw() 
print(plt1) 
dev.copy(png, "force_time.png") 
dev.off() 

dev.new() 
plt2 = ggplot()+ 
     geom_path(data = jump_data, aes(x = Percent_Displacement, y = Force, 
       color = Jump_Number, group = Jump_Number)) + 
     geom_path(data = interp_data, aes(x = Percent_Displacement, y = Force, 
       color = Jump_Number, group = Jump_Number)) + 
     theme_bw() 
print(plt2) 
dev.copy(png, "force_percent_disp.png") 
dev.off() 

names(interp_data) = c("Normalized_Displacement_(%)", "Force", "Jump_Number") 
print(interp_data) 

Eines der Grundstücke durch das Skript erzeugt ist:

percent_displacement_time