2016-09-21 7 views
0

私は多くの最適化オプションを持たないソフトウェアから得られた多数の生データを持っています。私はcsvに変換し、Rに読み込むとき 、私はこれを取得:列のペアを行に移動して同時にIDを作成する方法はありますか?

enter image description here

あなたが見ることができるように、私は、データの15種類のパックのための変数の2種類、ForceTimeを、持っています。私はtidyr機能gather()を使用してみましたが、結果はsatisfatoryなかった

ID      | Force| Time 
------------------------------------ 
SR_1.5x1.5x1.5_90s 001 | 52.2 | 0.00 
SR_1.5x1.5x1.5_90s 001 | 55.3 | 0.04 
...     | ... | ... 
SR_1.5x1.5x1.5_90s 002 | 64.8 | 0.00 
SR_1.5x1.5x1.5_90s 002 | 69.6 | 0.04 

:私はグループにのみ2列の力と時間のすべてのデータを求めており、すべてのデータセットのIDと3番目の列を作成し、このような何か。

これは私がここで行う最初の質問です。情報がない場合は謝罪します。

答えて

2

最初にgatherすべての列を入力し、次にspreadを交互に入力して、ForceTime行を交互に入力します。 tidyrdplyrを使用して

rtabla1 <- structure(list(SR_1.5x1.5x1.5_90s.001.Force = c(52.2, 55.3, 62.6, 66.5, 70.8, 75.9, 77.6, 78.7, 80.2, 83.8), SR_1.5x1.5x1.5_90s.001.Time = c(0, 0.004, 0.008, 0.012, 0.016, 0.02, 0.024, 0.028, 0.032, 0.036), 
SR_1.5x1.5x1.5_90s.002.Force = c(64.8, 69.6, 76, 80.2, 85.1, 
90.5, 94.1, 95.6, 99.7, 103.4), SR_1.5x1.5x1.5_90s.002.Time = c(0, 
0.004, 0.008, 0.012, 0.016, 0.02, 0.024, 0.028, 0.032, 0.036 
)), .Names = c("SR_1.5x1.5x1.5_90s.001.Force", "SR_1.5x1.5x1.5_90s.001.Time", "SR_1.5x1.5x1.5_90s.002.Force", "SR_1.5x1.5x1.5_90s.002.Time"), row.names = c(NA, -10L), class = "data.frame") 
## SR_1.5x1.5x1.5_90s.001.Force SR_1.5x1.5x1.5_90s.001.Time SR_1.5x1.5x1.5_90s.002.Force SR_1.5x1.5x1.5_90s.002.Time 
##1       52.2      0.000       64.8      0.000 
##2       55.3      0.004       69.6      0.004 
##3       62.6      0.008       76.0      0.008 
##4       66.5      0.012       80.2      0.012 
##5       70.8      0.016       85.1      0.016 
##6       75.9      0.020       90.5      0.020 
##7       77.6      0.024       94.1      0.024 
##8       78.7      0.028       95.6      0.028 
##9       80.2      0.032       99.7      0.032 
##10       83.8      0.036      103.4      0.036 

まず、としてあなたのデータの小さなスニペットを再作成

library(dplyr) 
library(tidyr) 
result <- rtabla1 %>% mutate(Row=seq_len(n())) %>%        ##1. 
         gather("ID","Vals",-Row) %>%        ##2. 
         mutate(FT=ifelse(grepl(".Force$",ID), "Force", "Time"), ##3. 
          ID=sub("(.Force$)|(.Time$)","",ID)) %>% 
         spread(FT,Vals) %>%          ##4. 
         select(-Row) %>%           ##5. 
         arrange(ID)            ##6. 

注:

  1. 最初にある識別子列を追加します行番号だけ。
  2. gather を除くすべての列は、集計された列名を含むID列になります。
  3. mutateIDカラムカラムを構成する文字列操作を使用してFT。このFT列は、収集された行のうちどれがForceで、どれがTimeであるかを識別するために作成されます。これは、その後のspreadで使用されます。その値は結果の列名(つまり"Force"または"Time")と一致するように作成されます。ここでは、greplを使用して、で終わるIDを確認してください。存在する場合は、FT列を"Force"に設定します。それ以外の場合は、FT列を"Time"に設定します。次にID列を更新して、末尾から".Force"または".Time"のいずれかを削除します。
  4. ここでFTをキーとし、値として収集した値を使用してspreadとします。
  5. 結果からの列を削除します。
  6. ID

result並び替え予想されるようにデータの小さな断片を使用することである:

print(result) 
##      ID Force Time 
##1 SR_1.5x1.5x1.5_90s.001 52.2 0.000 
##2 SR_1.5x1.5x1.5_90s.001 55.3 0.004 
##3 SR_1.5x1.5x1.5_90s.001 62.6 0.008 
##4 SR_1.5x1.5x1.5_90s.001 66.5 0.012 
##5 SR_1.5x1.5x1.5_90s.001 70.8 0.016 
##6 SR_1.5x1.5x1.5_90s.001 75.9 0.020 
##7 SR_1.5x1.5x1.5_90s.001 77.6 0.024 
##8 SR_1.5x1.5x1.5_90s.001 78.7 0.028 
##9 SR_1.5x1.5x1.5_90s.001 80.2 0.032 
##10 SR_1.5x1.5x1.5_90s.001 83.8 0.036 
##11 SR_1.5x1.5x1.5_90s.002 64.8 0.000 
##12 SR_1.5x1.5x1.5_90s.002 69.6 0.004 
##13 SR_1.5x1.5x1.5_90s.002 76.0 0.008 
##14 SR_1.5x1.5x1.5_90s.002 80.2 0.012 
##15 SR_1.5x1.5x1.5_90s.002 85.1 0.016 
##16 SR_1.5x1.5x1.5_90s.002 90.5 0.020 
##17 SR_1.5x1.5x1.5_90s.002 94.1 0.024 
##18 SR_1.5x1.5x1.5_90s.002 95.6 0.028 
##19 SR_1.5x1.5x1.5_90s.002 99.7 0.032 
##20 SR_1.5x1.5x1.5_90s.002 103.4 0.036 
関連する問題