我有以下数据:
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
..并且我想根据第三列的值更改来更改第二列的元素,以获得以下信息:
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
因此,在第三列的值更改之前,我想用具有相同第三列值的第一列的第一元素替换同一行的第二列元素。
答案 0 :(得分:1)
这可以使用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
答案 1 :(得分:1)
这是一个使用rle
和cumsum
来确定第2列中需要更新的元素的索引的解决方案。
# Create data frame
df <- read.table(text = "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 ", header = FALSE)
# Create index
ind <- cumsum(rle(df$V3)$lengths)
# Update data frame
df[ind, 2] <- df[head(c(1, ind + 1), length(ind)), 1]
# Print result
print(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
由reprex package(v0.2.1)于2019-01-16创建
答案 2 :(得分:0)
一个rleid
中带有data.table
的选项。转换为data.table
(setDT(df)
)后,按运行长度ID'V3'分组,replace
将'V2'的最后一个元素与{ V1”并将其分配({{1)}到'V2'
first
:=