2017-01-21 3 views
2

前の質問と同様ですが、もっと複雑です。idでデータフレーム内のデータの一部を減算する

date <- c("2016-03-24","2016-03-24","2016-03-24","2016-03-24","2016-03-24", 
      "2016-03-24","2016-03-24","2016-03-24","2016-03-24","2016-03-24") 
location <- c(1,1,2,2,3,3,4,4,"out","out") 
sensor <- c(1,16,1,16,1,16,1,16,1,16) 
Temp <- c(35,34,92,42,21,47,37,42,63,12) 
df <- data.frame(date,location,sensor,Temp) 

私は他の場所を無視した場所「4」から位置「アウト」を減算したいと私は、日付とセンサーでそれをやりたいです。私は以下のコードを試しましたが、結果としてNAsを取得しました。私は何が間違っていたのか分かりません。

DailyMaxInOutDiff04 <- df %>% group_by(date, sensor) %>% summarise(diff = Temp[location=="4"]- Temp[location=="out"]) 

編集この例では、今取り組んでいるが、それは私の実際のデータフレームで作業されていません。

私が望む結果は以下の通りです:

 date location sensor diff 
1 2016-03-24  4  1 -26 
2 2016-03-24  4  16 30 
+1

で 'as.data.frame'をしないでください'cbind'; data.frameを作成する前に、マトリックスを作成することによって、すべてのデータをキャラクターに強制しています。単に 'data.frame'を単独で使うと、' NA'がなくなります。 – alistaire

+0

@alistaireありがとうございます。これはこの例では機能しますが、私の実際のデータフレーム( 'cbind'と' as.data.frame'を使わない)では動作しませんが、まだNAsを生成します。日付と場所はデータフレーム内の文字なので、データフレームの要素と同じである可能性がありますか? – phaser

+0

与えられた操作がその型ではうまくいかない場合は、本当に重要です。 'group_by'は気にしませんし、' == 'はうまくいくはずですので、明らかに別のものです。 – alistaire

答えて

1

私たちは、グループ化します前に、それはfilter最初に優れている

df %>% 
    filter(location %in% c(4, 'out')) %>% 
    group_by(date, sensor) %>% 
    summarise(Diff = Temp[location=="4"] - Temp[location=="out"], 
       location = first(location)) %>% 
    select(1, 2, 4, 3) 
#  date sensor location Diff 
#  <fctr> <dbl> <fctr> <dbl> 
#1 2016-03-24  1  4 -26 
#2 2016-03-24  16  4 30 
+0

ありがとうございます。私はselect関数以外のすべてを理解しています。なぜ1、2、4、3? – phaser

+1

@phaser期待どおりの出力と同じ順序で列を保持するだけです。これらは列インデックスです – akrun

+0

@phaser [ここ](http://stackoverflow.com/help/someone-answers)をチェックすることもできます。 – akrun

関連する問題