2017-04-18 5 views
0

私はdf dataを持っています。同じ係数の場合は、前の列と行に存在する値を新しい列に追加したいと思います。ここで 条件の下で前の行の値を加算する

はサンプルです:

data <- structure(list(Id = c("a", "b", "b", "b", "a", "a", "b", "b", 
"a", "a"), duration.minutes = c(NA, 139L, 535L, 150L, NA, NA, 
145L, 545L, 144L, NA), event = structure(c(1L, 4L, 3L, 4L, 2L, 
1L, 4L, 3L, 4L, 2L), .Label = c("enter", "exit", "stop", "trip" 
), class = "factor")), .Names = c("Id", "duration.minutes", "event" 
), class = "data.frame", row.names = 265:274) 

と私はこのような「duration.minutes.past」と呼ばれる新しい列を追加したいと思います:

data <- structure(list(Id = c("a", "b", "b", "b", "a", "a", "b", "b", 
"a", "a"), duration.minutes = c(NA, 139L, 535L, 150L, NA, NA, 
145L, 545L, 144L, NA), event = structure(c(1L, 4L, 3L, 4L, 2L, 
1L, 4L, 3L, 4L, 2L), .Label = c("enter", "exit", "stop", "trip" 
), class = "factor"), duration.minutes.past = c(NA, NA, 139, 
NA, NA, NA, NA, 145, NA, NA)), .Names = c("Id", "duration.minutes", 
"event", "duration.minutes.past"), row.names = 265:274, class = "data.frame") 

あなたが見ることができるように、私が追加しましたこの新しい列のduration.minutes.past の前のtripと同じIdのものです。 Idが異なる場合、または停止しない場合は、duration.minutes.pastの値はNAです。

大変助かりました!

答えて

1

data.tableでこれを行うことができます。 'data.frame'を 'id'でグループ化した 'data.table'(setDT(data))に変換し、shiftを使用して 'duration.minutes'のlag列を作成し、 'NA'に変更しますストップ '

library(data.table) 
setDT(data)[, duration.minutes.past := shift(duration.minutes), 
      Id][event != "stop", duration.minutes.past := NA][] 
data 
# Id duration.minutes event duration.minutes.past 
#1: a    NA enter     NA 
#2: b    139 trip     NA 
#3: b    535 stop     139 
#4: b    150 trip     NA 
#5: a    NA exit     NA 
#6: a    NA enter     NA 
#7: b    145 trip     NA 
#8: b    545 stop     145 
#9: a    144 trip     NA 
#10: a    NA exit     NA 

またはこのbase Rdplyrを用いave

data$duration.minutes.past <- with(data, NA^(event != "stop") * 
     ave(duration.minutes, Id, FUN = function(x) c(NA, x[-length(x)]))) 
+0

また、良い解決策ですが、私のサンプルよりも多くの列があります:)。しかし、ありがとう! – Floni

+0

@Floniもっと多くの列を持つことで何が問題になりますか? ':='を使用して新しい列を作成するので、他の列に影響はありません – akrun

+1

真実、申し訳ありません - 完璧に動作します!ありがとうございました! – Floni

2

可能な溶液を用いて行うことができ、'と等しくない'

library(dplyr) 

df %>% 
group_by(Id) %>% 
mutate(new = replace(lag(duration.minutes), event != 'stop', NA)) 

#Source: local data frame [10 x 4] 
#Groups: Id [2] 

#  Id duration.minutes event new 
# <chr>   <int> <fctr> <int> 
#1  a    NA enter NA 
#2  b    139 trip NA 
#3  b    535 stop 139 
#4  b    150 trip NA 
#5  a    NA exit NA 
#6  a    NA enter NA 
#7  b    145 trip NA 
#8  b    545 stop 145 
#9  a    144 trip NA 
#10  a    NA exit NA 
+1

非常にうまくいった! – Floni

関連する問題