如何根据另一列

时间:2017-04-30 21:49:47

标签: r dataframe row multiple-columns addition

大家好我拥有数据集的一部分:

# 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

提前致谢!

乔伊

DATA

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))

4 个答案:

答案 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