如何在基于另一列的列中添加不同的值
How to add different values in a column based on another column
大家好,我有一部分数据集:
# 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))
一个简单的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
另一种解决方案是使用 base R 和 rle
:
df$value2 <- df$value + unlist(sapply(rle(df$id)$lengths, function(x) (1:x) - 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
使用 dplyr
您可以执行以下操作...
library(dplyr)
df2 <- df %>% group_by(id) %>% mutate(value=value+seq_along(id)-1)
或者我们可以使用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
大家好,我有一部分数据集:
# 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))
一个简单的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
另一种解决方案是使用 base R 和 rle
:
df$value2 <- df$value + unlist(sapply(rle(df$id)$lengths, function(x) (1:x) - 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
使用 dplyr
您可以执行以下操作...
library(dplyr)
df2 <- df %>% group_by(id) %>% mutate(value=value+seq_along(id)-1)
或者我们可以使用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