2016-09-14 57 views
3

我有4個傳感器,T1, T2, T3, T4,按時間間隔定期採集數據。每個傳感器位於不同的徑向和角度位置。這些數據被存儲這樣的:整理一個數據幀,其中每列包含多個變量

test_data <- data.frame(T1=c(0,0,rnorm(3),NA,rnorm(6)), T2=c(1,0,NA,NA,rnorm(8)), T3=c(0,2*pi,rnorm(9),NA), T4=c(1,2*pi,rnorm(1),NA,rnorm(8))) 

即,含有對傳感器觀測列的前兩行我分別包含半徑和傳感器的角位置。以下行存儲從傳感器獲取的度量。有些測量可能會丟失,

我想有一個數據幀tidy格式,因此每列只能包含1個變量。這意味着半徑和角度必須有自己的列。因此,傳感器測量不能再存儲在並行列中,但必須串行存儲。第二步很容易:

library(tidyr) 
test_data <- test_data %>% gather(Sensor, Temperature) 

但是,我不確定哪一種是執行第一步最常用的方法。當然,我可以使用for循環,但我想知道是否可以有更習慣的方式。

回答

4

也許是這樣的:

angle <- test_data %>% 
    slice(1:2) %>% 
    t %>% 
    data.frame %>% 
    setNames(., c("Radial", "Angular")) %>% 
    tibble::rownames_to_column("Sensor") 

test_data %>% 
    slice(3:nrow(.)) %>% 
    gather(Sensor, Temperature) %>% 
    left_join(angle) 

或按在評論中提到的,更地道:

test_data %>% 
    gather(Sensor, Temperature) %>% 
    group_by(Sensor) %>% 
    mutate(r = first(Temperature), theta = nth(Temperature,2)) %>% 
    slice(3:n()) 
+1

嘿嘿,真好!但我認爲創建一個額外的數據框然後加入是不必要的。那麼'test_data_tidy < - test_data%>%group_by(Sensor)%>%mutate(r = Temperature [1],theta = Temperature [2])%>%slice(3:nrow(。))''?謝謝你教我「片」,我不知道這一點。 – DeltaIV

+2

@DeltaIV Yup這也是一種有效的方法。也許使用'.. r = first(溫度),θ= n(溫度,2)'更加習慣。 –

1

這是有點晚了,但我不相信你需要slicejoin。只需調換你的數據,並使用原始數據的列名的Sensor添加一列:

test_data <- data.frame(t(test_data), Sensor=colnames(test_data)) 

然後,您可以gather。在這裏,我添加的列名的每個測量方便:

library(dplyr) 
library(tidyr) 
test_data %>% setNames(c("Radial", "Azimuth", paste0("M",1:(ncol(test_data)-3)), "Sensor")) %>% 
       gather("Measurement", "Temperature", M1:M10) 

對於set.seed(123)生成以下輸入:

test_data <- structure(list(T1 = c(0, 0, -0.560475646552213, -0.23017748948328, 
1.55870831414912, NA, 0.070508391424576, 0.129287735160946, 1.71506498688328, 
0.460916205989202, -1.26506123460653, -0.686852851893526), T2 = c(1, 
0, NA, NA, -0.445661970099958, 1.22408179743946, 0.359813827057364, 
0.400771450594052, 0.11068271594512, -0.555841134754075, 1.78691313680308, 
0.497850478229239), T3 = c(0, 6.28318530717959, -1.96661715662964, 
0.701355901563686, -0.472791407727934, -1.06782370598685, -0.217974914658295, 
-1.02600444830724, -0.72889122929114, -0.625039267849257, -1.68669331074241, 
NA), T4 = c(1, 6.28318530717959, 0.837787044494525, NA, 0.153373117836515, 
-1.13813693701195, 1.25381492106993, 0.426464221476814, -0.295071482992271, 
0.895125661045022, 0.878133487533042, 0.821581081637487)), .Names = c("T1", 
"T2", "T3", "T4"), row.names = c(NA, -12L), class = "data.frame") 
##   T1   T2   T3   T4 
##1 0.00000000 1.0000000 0.0000000 1.0000000 
##2 0.00000000 0.0000000 6.2831853 6.2831853 
##3 -0.56047565   NA -1.9666172 0.8377870 
##4 -0.23017749   NA 0.7013559   NA 
##5 1.55870831 -0.4456620 -0.4727914 0.1533731 
##6   NA 1.2240818 -1.0678237 -1.1381369 
##7 0.07050839 0.3598138 -0.2179749 1.2538149 
##8 0.12928774 0.4007715 -1.0260044 0.4264642 
##9 1.71506499 0.1106827 -0.7288912 -0.2950715 
##10 0.46091621 -0.5558411 -0.6250393 0.8951257 
##11 -1.26506123 1.7869131 -1.6866933 0.8781335 
##12 -0.68685285 0.4978505   NA 0.8215811 

你得到:

## Radial Azimuth Sensor Measurement Temperature 
##1  0 0.000000  T1   M1 -0.56047565 
##2  1 0.000000  T2   M1   NA 
##3  0 6.283185  T3   M1 -1.96661716 
##4  1 6.283185  T4   M1 0.83778704 
##5  0 0.000000  T1   M2 -0.23017749 
##6  1 0.000000  T2   M2   NA 
##7  0 6.283185  T3   M2 0.70135590 
##8  1 6.283185  T4   M2   NA 
##9  0 0.000000  T1   M3 1.55870831 
##10  1 0.000000  T2   M3 -0.44566197 
##11  0 6.283185  T3   M3 -0.47279141 
##12  1 6.283185  T4   M3 0.15337312 
##13  0 0.000000  T1   M4   NA 
##14  1 0.000000  T2   M4 1.22408180 
##15  0 6.283185  T3   M4 -1.06782371 
##16  1 6.283185  T4   M4 -1.13813694 
##17  0 0.000000  T1   M5 0.07050839 
##18  1 0.000000  T2   M5 0.35981383 
##19  0 6.283185  T3   M5 -0.21797491 
##20  1 6.283185  T4   M5 1.25381492 
##21  0 0.000000  T1   M6 0.12928774 
##22  1 0.000000  T2   M6 0.40077145 
##23  0 6.283185  T3   M6 -1.02600445 
##24  1 6.283185  T4   M6 0.42646422 
##25  0 0.000000  T1   M7 1.71506499 
##26  1 0.000000  T2   M7 0.11068272 
##27  0 6.283185  T3   M7 -0.72889123 
##28  1 6.283185  T4   M7 -0.29507148 
##29  0 0.000000  T1   M8 0.46091621 
##30  1 0.000000  T2   M8 -0.55584113 
##31  0 6.283185  T3   M8 -0.62503927 
##32  1 6.283185  T4   M8 0.89512566 
##33  0 0.000000  T1   M9 -1.26506123 
##34  1 0.000000  T2   M9 1.78691314 
##35  0 6.283185  T3   M9 -1.68669331 
##36  1 6.283185  T4   M9 0.87813349 
##37  0 0.000000  T1   M10 -0.68685285 
##38  1 0.000000  T2   M10 0.49785048 
##39  0 6.283185  T3   M10   NA 
##40  1 6.283185  T4   M10 0.82158108 
相關問題