我的数据集的格式类似于:
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
,但不确定如何根据分割后的偏移来访问值。有什么想法吗?
答案 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的lag
和lead
值;量&#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中完成相同的操作。