大家好我拥有数据集的一部分:
# A tibble: 10 × 2
id value
<dbl> <dbl>
1 1 2
2 1 2
3 1 2
4 5 2
5 6 3
6 7 0
7 8 4
8 8 4
9 9 1
10 9 1
我想在同一个ID的每个后续值中添加“1”。例如。 “id 1”的第一个值是2,而“id 1”的第二个值是3,“id 1”的第三个值是4.但是,那个只有1个id(5,6,7)的值保留为是。所以基本上它看起来像前几个值:
# A tibble: 10 × 2
id value
<dbl> <dbl>
1 1 2
2 1 3
3 1 4
4 5 2
5 6 3
6 7 0
7 8 4
8 8 5
9 9 1
10 9 2
提前致谢!
乔伊
structure(list(id = c(1, 1, 1, 5, 6, 7, 8, 8, 9, 9), value = c(2,
2, 2, 2, 3, 0, 4, 4, 1, 1)), .Names = c("id", "value"), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -10L))
预期产出:
structure(list(id = c(1, 1, 1, 5, 6, 7, 8, 8, 9, 9), value = c(2,
3, 4, 2, 3, 0, 4, 5, 1, 2)), .Names = c("id", "value"), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -10L))
答案 0 :(得分:2)
一个简单的data.table
解决方案是:
library(data.table)
dt<-as.data.table(df)
dt[, value2 := value + ((1:.N) - 1), by = id]
dt
# id value value2
# 1: 1 2 2
# 2: 1 2 3
# 3: 1 2 4
# 4: 5 2 2
# 5: 6 3 3
# 6: 7 0 0
# 7: 8 4 4
# 8: 8 4 5
# 9: 9 1 1
#10: 9 1 2
另一种解决方案是使用基数R和rle
:
df$value2 <- df$value + unlist(sapply(rle(df$id)$lengths, function(x) (1:x) - 1))
答案 1 :(得分:1)
这是dplyr
的解决方案。如果数字不是渐进的(换句话说是增加的话),那么考虑不是很强大,但我知道它们是如此。如果不是,我们必须找到另一种解决方案。
df %>% group_by(id) %>%
transmute(value = seq(from = min(value), by = 1, length.out = length(value)) )
Adding missing grouping variables: `id`
Source: local data frame [10 x 2]
Groups: id [6]
id value
<dbl> <dbl>
1 1 2
2 1 3
3 1 4
4 5 2
5 6 3
6 7 0
7 8 4
8 8 5
9 9 1
10 9 2
答案 2 :(得分:1)
使用dplyr
您可以执行以下操作...
library(dplyr)
df2 <- df %>% group_by(id) %>% mutate(value=value+seq_along(id)-1)
答案 3 :(得分:0)
或者我们可以使用base R
df1$value <- with(df1, ave(value, id, FUN =seq_along)+value -1)
df1$value
#[1] 2 3 4 2 3 0 4 5 1 2