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
使用 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