R数据帧:用每组(另一列)替换第一个值(一列)

R数据帧:用每组(另一列)替换第一个值(一列),r,dataframe,replace,R,Dataframe,Replace,我想将have转换为want(请参见下文)。具体来说,我想将每个组(have$a)的第一个值(have$b)更改为一个公共值(此处为零) 拥有因此您需要一种方法来建立分组变量并获取组内的行号。这可以很容易地用data.table完成 library(data.table) have <- data.table(a=c(1,2,2,3,3,3), b=c(-5, -3, 2, -2, 6, 2)) 注意id列是如何计算a每组中的行的。现在您想用0替换b,其中id==1。这里,第一个索引将过

我想将
have
转换为
want
(请参见下文)。具体来说,我想将每个组(
have$a)
的第一个值(
have$b
)更改为一个公共值(此处为零)


拥有因此您需要一种方法来建立分组变量并获取组内的行号。这可以很容易地用
data.table
完成

library(data.table)
have <- data.table(a=c(1,2,2,3,3,3), b=c(-5, -3, 2, -2, 6, 2))
注意
id
列是如何计算
a
每组中的行的。现在您想用0替换
b
,其中
id==1
。这里,第一个索引将过滤行,第二个参数将值分配给
b
,但仅在满足过滤条件的情况下

have[id == 1, b := 0]
#>    a b id
#> 1: 1 0  1
#> 2: 2 0  1
#> 3: 2 2  2
#> 4: 3 0  1
#> 5: 3 6  2
#> 6: 3 2  3
最后,您可以通过将额外的
id
列赋值为null来删除该列

have[,id := NULL]

因此,您需要一种方法来建立分组变量并获取组内的行号。这可以很容易地用
data.table
完成

library(data.table)
have <- data.table(a=c(1,2,2,3,3,3), b=c(-5, -3, 2, -2, 6, 2))
注意
id
列是如何计算
a
每组中的行的。现在您想用0替换
b
,其中
id==1
。这里,第一个索引将过滤行,第二个参数将值分配给
b
,但仅在满足过滤条件的情况下

have[id == 1, b := 0]
#>    a b id
#> 1: 1 0  1
#> 2: 2 0  1
#> 3: 2 2  2
#> 4: 3 0  1
#> 5: 3 6  2
#> 6: 3 2  3
最后,您可以通过将额外的
id
列赋值为null来删除该列

have[,id := NULL]

dplyr
方法可能是

库(dplyr)
拥有%>%
组别(a)%>%
变异(b=case_当(row_number()==1~0时,#将每组的第一行值替换为0
真的(b))

      a     b
  <dbl> <dbl>
1  1.00  0   
2  2.00  0   
3  2.00  2.00
4  3.00  0   
5  3.00  6.00
6  3.00  2.00
ab
1  1.00  0   
2  2.00  0   
3  2.00  2.00
4  3.00  0   
5  3.00  6.00
6  3.00  2.00

样本数据:

have <- structure(list(a = c(1, 2, 2, 3, 3, 3), b = c(-5, -3, 2, -2, 
6, 2)), .Names = c("a", "b"), row.names = c(NA, -6L), class = "data.frame")

have
dplyr
方法可能是

库(dplyr)
拥有%>%
组别(a)%>%
变异(b=case_当(row_number()==1~0时,#将每组的第一行值替换为0
真的(b))

      a     b
  <dbl> <dbl>
1  1.00  0   
2  2.00  0   
3  2.00  2.00
4  3.00  0   
5  3.00  6.00
6  3.00  2.00
ab
1  1.00  0   
2  2.00  0   
3  2.00  2.00
4  3.00  0   
5  3.00  6.00
6  3.00  2.00

样本数据:

have <- structure(list(a = c(1, 2, 2, 3, 3, 3), b = c(-5, -3, 2, -2, 
6, 2)), .Names = c("a", "b"), row.names = c(NA, -6L), class = "data.frame")

受其他答案的启发,我想给出这个基本的
R
方法:

have$b[ c(1, diff(have$a))==1 ] <- 0

受其他答案的启发,我想给出以下基本
R
方法:

have$b[ c(1, diff(have$a))==1 ] <- 0