R - 基于另一列的变异列

R - Mutate column based on another column

使用 R: 对于数据框:

A<-c(3,3,3,3,1,1,2,2,2,2,2)
df<-data.frame(A)

如何添加一列以使输出与以下内容相同:

A<-c(3,3,3,3,1,1,2,2,2,2,2)
df<-data.frame(A)

B<-c(1,1,1,0,1,0,1,1,0,0,0)
mutate(df,B)

换句话说,是否有 'B' 列的公式 - 这样它会查看 'A' 列......并列出“1”,3 次输入“0” .....等等等等

所以 - 所需的输出(给定列 'A')是:

谢谢。

在这里,我每次 A 更改时分配一个新组,然后在每个组中的第一个 #A 行的 B 中放置一个 1。

(如果每个组的 A 的值不同,您可以将前两行替换为 group_by(A),但不清楚这是否是一个合理的假设。)

library(dplyr)
df %>%
  mutate(group = cumsum(A != lag(A, default = 0))) %>%
  group_by(group) %>%
  mutate(B = 1 * (row_number() <= A)) %>%
  ungroup()

结果

# A tibble: 11 x 3
       A group     B
   <dbl> <int> <dbl>
 1     3     1     1
 2     3     1     1
 3     3     1     1
 4     3     1     0
 5     1     2     1
 6     1     2     0
 7     2     3     1
 8     2     3     1
 9     2     3     0
10     2     3     0
11     2     3     0

按'A'分组后,在'A'的值上用rep加上1、0,行数与分组值

的差值
library(dplyr)
library(data.table)
df %>%
   group_by(A, grp = rleid(A)) %>%
   mutate(B =  rep(c(1, 0), c(first(A), n() - first(A)))) %>%   
   ungroup  %>%
   select(-grp)

-输出

# A tibble: 11 x 2
#       A     B
#   <dbl> <dbl>
# 1     3     1
# 2     3     1
# 3     3     1
# 4     3     0
# 5     1     1
# 6     1     0
# 7     2     1
# 8     2     1
# 9     2     0
#10     2     0
#11     2     0

或使用 base R

中的 rle
with(rle(df$A), rep(rep(c(1, 0), length(values)),  c(values, lengths-values)))
#[1] 1 1 1 0 1 1 0 1 0 0 0