变异以获取值之前和之后的值

时间:2015-02-17 04:44:59

标签: r plyr reshape

我的数据集的格式类似于:

amount | event
------ | ------
 3     |  FALSE
 4     |  FALSE
 6     |  TRUE
 7     |  FALSE
 3     |  FALSE
 4     |  TRUE
 8     |  FALSE

并且希望基于event列的值进行拆分和变异,并且仅当event的值为TRUE时,才创建仅在行前后填充值的新列。例如:

amount | event | before | after
------ | ----- | -----  | -----
 3     | FALSE |  NA    | NA
 4     | FALSE |  NA    | NA
 6     | TRUE  |  4     | 7
 7     | FALSE |  NA    | NA
 3     | FALSE |  NA    | NA
 4     | TRUE  |  3     | 8
 8     | FALSE |  NA    | NA

我正在考虑使用ddply mutate,但不确定如何根据分割后的偏移来访问值。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

使用base R,我们会在'事件'中找到TRUE值的位置。使用which(' indx')的列,创建两个NA列(''''''),然后我们分配'量'位于< indx'以下1和1位置的值之前'之前和'之后'列

indx <- which(df1$event)
df1[c('before','after')] <- NA
df1$before[indx] <- df1$amount[indx-1]
df1$after[indx] <- df1$amount[indx+1]
 df1
 #  amount event before after
 #1      3 FALSE     NA    NA
 #2      4 FALSE     NA    NA
 #3      6  TRUE      4     7
 #4      7 FALSE     NA    NA
 #5      3 FALSE     NA    NA
 #6      4  TRUE      3     8
 #7      8 FALSE     NA    NA

或者使用data.table(类似于@Marat Talipov的想法),我们可以使用shift来获取&#39的laglead值;量&#39;在&#39;之前/之后创建列。我们更改了&#39; event&#39;中FALSE值对应的那些列中的行(!event)为NA。

 library(data.table)#data.table_1.9.5
 setDT(df1)[,c('before', 'after'):= list(shift(amount, type='lag'),
    shift(amount, type='lead')) ][(!event), 3:4 := NA][]
 #     amount event before after
 #1:      3 FALSE     NA    NA
 #2:      4 FALSE     NA    NA
 #3:      6  TRUE      4     7
 #4:      7 FALSE     NA    NA
 #5:      3 FALSE     NA    NA
 #6:      4  TRUE      3     8
 #7:      8 FALSE     NA    NA

数据

df1 <- structure(list(amount = c(3L, 4L, 6L, 7L, 3L, 4L, 8L), 
event = c(FALSE, 
FALSE, TRUE, FALSE, FALSE, TRUE, FALSE)), .Names = c("amount", 
"event"), class = "data.frame", row.names = c(NA, -7L))

答案 1 :(得分:3)

您可以使用此代码:

library(dplyr)

d %>% 
  mutate(before=ifelse(event,lag(amount),NA),
         after =ifelse(event,lead(amount),NA))

#  amount event before after
#1      3 FALSE     NA    NA
#2      4 FALSE     NA    NA
#3      6  TRUE      4     7
#4      7 FALSE     NA    NA
#5      3 FALSE     NA    NA
#6      4  TRUE      3     8
#7      8 FALSE     NA    NA

其中d是您的示例数据集:

d <- structure(list(amount = c(3, 4, 6, 7, 3, 4, 8), event = c(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE)), .Names = c("amount", "event"), row.names = c(NA, -7L), class = "data.frame")

答案 2 :(得分:0)

数据

df1 <- structure(list(smp = 1:17, x = c(609, 609, 609, 625, 625, 608, 608, 608, 608, 608, 608, 608, 630, 631, 605, 603, 602), y = c(449, 446, 446, 460, 455, 445, 445, 445, 445, 445, 445, 445, 459, 459, 446, 448, 452), blink = c(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE)), .Names = c("smp", "x", "y", "blink"), class = "data.frame", row.names = c(NA, -17L))

在这个存在多个TRUE值的数据实例中,可能需要采用不同的方法来索引以在感兴趣的条件之前和之后实际获得值,因为上述基本方法将返回感兴趣的条件内的值。

考虑在条件之前和之后想要SpatialPoints,然后想要将给定点的前一距离和给定点的后一条件进行比较。在那种情况下,你想要在条件之前和之后(仅)之后的点(只是),并且可能不想要下注者。类似于上面的akrun的答案,这表明调整左手侧(LHS)和右手侧(RHS)的指数。调整LHS和RHS的索引提供了对感兴趣条件(在之前或之后)的“外部性”进行第二次逻辑测试的机会,即在上述方法之后存在多个T的情况下,上述方法没有解决。 F后跟F,即F,T,T,T,F,F。

head(df1, n = 17) smp x y blink 1 1 609 449 FALSE 2 2 609 446 FALSE 3 3 609 446 TRUE 4 4 625 460 FALSE 5 5 625 455 FALSE 6 6 608 445 TRUE 7 7 608 445 TRUE 8 8 608 445 FALSE 9 9 608 445 FALSE 10 10 608 445 TRUE 11 11 608 445 TRUE 12 12 608 445 TRUE 13 13 630 459 FALSE 14 14 631 459 FALSE 15 15 605 446 TRUE 16 16 603 448 TRUE 17 17 602 452 FALSE

df1[c('pre_x', 'pre_y', 'post_x', 'post_y')] <- NA

在这个例子中,pre_x / pre_y,post_x / post_y最终将成为cbind coords,然后是SpatialPoints;但是,这是在确定之前和之后的内容之后。您的用例可能有所不同,但逻辑应该成立。

indx_1 <- which(df1$blink)

indx_1 [1] 3 6 7 10 11 12 15 16

然后使用indx_1计算pre_x,pre_y,post_x,post_y:

df1$pre_x[indx_1 - 1] <- df1$x[indx_1 - 1] df1$pre_y[indx_1 - 1] <- df1$y[indx_1 - 1] df1$post_x[indx_1 + 1] <- df1$post_x[indx_1 + 1] df1$post_y[indx_1 + 1] <- df1$post_y[indx_1 + 1]

> head(df1, n = 17) smp x y blink pre_x pre_y post_x post_y 1 1 609 449 FALSE NA NA NA NA 2 2 609 446 FALSE 609 446 NA NA 3 3 609 446 TRUE NA NA NA NA 4 4 625 460 FALSE NA NA 625 460 5 5 625 455 FALSE 625 455 NA NA 6 6 608 445 TRUE 608 445 NA NA 7 7 608 445 TRUE NA NA 608 445 8 8 608 445 FALSE NA NA 608 445 9 9 608 445 FALSE 608 445 NA NA 10 10 608 445 TRUE 608 445 NA NA 11 11 608 445 TRUE 608 445 608 445 12 12 608 445 TRUE NA NA 608 445 13 13 630 459 FALSE NA NA 630 459 14 14 631 459 FALSE 631 459 NA NA 15 15 605 446 TRUE 605 446 NA NA 16 16 603 448 TRUE NA NA 603 448 17 17 602 452 FALSE NA NA 602 452

现在,所需的值是在感兴趣的条件之外写出的 并可靠地报告前后值。此外, a之前索引(indx_2)和之后(indx_3)可用于选择进一步处理,在我的例子中为SpatialPoints制作坐标。

indx_2 <- which(!df1$blink & !is.na(df1$pre_x))

indx_3 <- which(!df1$blink & !is.na(df1$post_x))

coords_pre <- cbind(x = df1$pre_x[indx_2], y = df1$pre_y[indx_2])

coords_post <- cbind( x = df1$post_x[indx_3], y = df1$post_y[indx_3])

library(sp) pre_blink_sp <- SpatialPoints(coords_pre) > summary(pre_blink_sp) Object of class SpatialPoints Coordinates: min max x 608 631 y 445 459 Is projected: NA proj4string : [NA] Number of points: 4

已经完成了如何在基地做了这个,尽管很简单,df1 $ smp 是否有setkey(),因为我现在试图弄清楚如何在data.table中完成相同的操作。