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")
havedplyr
方法可能是
库(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