我有以下数据:
1 2 1
2 3 1
3 4 1
4 5 1
5 6 2
6 7 2
7 8 2
9 10 3
10 11 3 ..and I希望根据第三列的值更改第二列的元素,以获得以下结果:
1 2 1
2 3 1
3 4 1
4 1 1
5 6 2
6 7 2
7 5 2
9 10 3
10 9 3 因此,在更改第三列中的值之前,我希望将同一行的第二列元素替换为具有相同第三列值的第一列的第一个元素。
发布于 2019-01-16 18:53:56
这可以使用split、unsplit和lapply函数来实现。对于每组V3值,我们将第二列中的最后一个值替换为第一列中的第一个值。split函数接受data.frame并将其转换为数据列表。
unsplit(lapply(split(dat, dat$V3),
FUN = function(d) {d[nrow(d), 2] <- d[1,1]; d}))
V1 V2 V3
1 1 2 1
2 2 3 1
3 3 4 1
4 4 1 1
5 5 6 2
6 6 7 2
7 7 5 2
8 9 10 3
9 10 9 3发布于 2019-01-17 10:08:36
使用来自rleid的data.table的一个选项。在转换为data.table (setDT(df))后,按'V3‘的游程-id进行分组,将'V2’的最后一个元素与'V1‘的first进行replace,并将其赋值(:=)给'V2’。
library(data.table)
setDT(df)[, V2 := replace(V2, .N, first(V1)), rleid(V3)]
df
# V1 V2 V3
#1: 1 2 1
#2: 2 3 1
#3: 3 4 1
#4: 4 1 1
#5: 5 6 2
#6: 6 7 2
#7: 7 5 2
#8: 9 10 3
#9: 10 9 3数据
df <- structure(list(V1 = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 9L, 10L), V2 = c(2L,
3L, 4L, 5L, 6L, 7L, 8L, 10L, 11L), V3 = c(1L, 1L, 1L, 1L, 2L,
2L, 2L, 3L, 3L)), class = "data.frame", row.names = c(NA, -9L
))https://stackoverflow.com/questions/54223392
复制相似问题