创建一个可以帮助我区分组内变化的变量
Create a variable that can help me distinguish within group changes
我有以下数据。我想制作变量 1 和变量 2。请查看此 png,您将看到我拥有的数据以及我想要制作的内容
我想使用 R,这样我就可以将 Variable wanted 设为 1,这会在每次出现变量“input”且不为空时创建一个组变量(如示例图片所示)。然后我想使用 Dplyr 创建变量 2,这基本上是在组内进行差异化。我想我可以用下面的方法做到这一点
df %>% group_by(Group, variable wanted 1) %>% mutate(variable2 = diff(df, lag=1))
但是如您所见,我在创建变量“Variable wanted 1”时遇到了问题。我希望我能充分解释自己,如果没有,我会很乐意编辑。感谢您的帮助!
df <- structure(list(Group = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3,
3, 3), Output = c(2, 3, 4, 5, 3, 4, 6, 7, 9, 10, 1, 4, 6, 8),
Input = c(NA, "a", NA, "b", NA, "a", NA, "b", NA, "c", NA,
"a", NA, "b")), row.names = c(NA, -14L), class = c("tbl_df",
"tbl", "data.frame"))
你可以试试
df %>%
group_by(Group) %>%
mutate(var_1 = rep(1:(n()/2), each = 2) ) %>%
mutate(var_2 = ifelse(is.na(Input), "NA", Output - lag(Output, 1) ))
Group Output Input var_1 var_2
<dbl> <dbl> <chr> <int> <chr>
1 1 2 NA 1 NA
2 1 3 a 1 1
3 1 4 NA 2 NA
4 1 5 b 2 1
5 2 3 NA 1 NA
6 2 4 a 1 1
7 2 6 NA 2 NA
8 2 7 b 2 1
9 2 9 NA 3 NA
10 2 10 c 3 1
11 3 1 NA 1 NA
12 3 4 a 1 3
13 3 6 NA 2 NA
14 3 8 b 2 2
根据您使用 fill
和 group_by
对问题的解释,您可以执行 -
library(dplyr)
library(tidyr)
df %>%
fill(Input, .direction = 'up') %>%
mutate(result1 = match(Input, unique(Input))) %>%
group_by(Group, result1) %>%
mutate(result2 = lag(result1)) %>%
ungroup
# Group Output Input result1 result2
# <dbl> <dbl> <chr> <int> <int>
# 1 1 2 a 1 NA
# 2 1 3 a 1 1
# 3 1 4 b 2 NA
# 4 1 5 b 2 2
# 5 2 3 a 1 NA
# 6 2 4 a 1 1
# 7 2 6 b 2 NA
# 8 2 7 b 2 2
# 9 2 9 c 3 NA
#10 2 10 c 3 3
#11 3 1 a 1 NA
#12 3 4 a 1 1
#13 3 6 b 2 NA
#14 3 8 b 2 2
我有以下数据。我想制作变量 1 和变量 2。请查看此 png,您将看到我拥有的数据以及我想要制作的内容
我想使用 R,这样我就可以将 Variable wanted 设为 1,这会在每次出现变量“input”且不为空时创建一个组变量(如示例图片所示)。然后我想使用 Dplyr 创建变量 2,这基本上是在组内进行差异化。我想我可以用下面的方法做到这一点
df %>% group_by(Group, variable wanted 1) %>% mutate(variable2 = diff(df, lag=1))
但是如您所见,我在创建变量“Variable wanted 1”时遇到了问题。我希望我能充分解释自己,如果没有,我会很乐意编辑。感谢您的帮助!
df <- structure(list(Group = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3,
3, 3), Output = c(2, 3, 4, 5, 3, 4, 6, 7, 9, 10, 1, 4, 6, 8),
Input = c(NA, "a", NA, "b", NA, "a", NA, "b", NA, "c", NA,
"a", NA, "b")), row.names = c(NA, -14L), class = c("tbl_df",
"tbl", "data.frame"))
你可以试试
df %>%
group_by(Group) %>%
mutate(var_1 = rep(1:(n()/2), each = 2) ) %>%
mutate(var_2 = ifelse(is.na(Input), "NA", Output - lag(Output, 1) ))
Group Output Input var_1 var_2
<dbl> <dbl> <chr> <int> <chr>
1 1 2 NA 1 NA
2 1 3 a 1 1
3 1 4 NA 2 NA
4 1 5 b 2 1
5 2 3 NA 1 NA
6 2 4 a 1 1
7 2 6 NA 2 NA
8 2 7 b 2 1
9 2 9 NA 3 NA
10 2 10 c 3 1
11 3 1 NA 1 NA
12 3 4 a 1 3
13 3 6 NA 2 NA
14 3 8 b 2 2
根据您使用 fill
和 group_by
对问题的解释,您可以执行 -
library(dplyr)
library(tidyr)
df %>%
fill(Input, .direction = 'up') %>%
mutate(result1 = match(Input, unique(Input))) %>%
group_by(Group, result1) %>%
mutate(result2 = lag(result1)) %>%
ungroup
# Group Output Input result1 result2
# <dbl> <dbl> <chr> <int> <int>
# 1 1 2 a 1 NA
# 2 1 3 a 1 1
# 3 1 4 b 2 NA
# 4 1 5 b 2 2
# 5 2 3 a 1 NA
# 6 2 4 a 1 1
# 7 2 6 b 2 NA
# 8 2 7 b 2 2
# 9 2 9 c 3 NA
#10 2 10 c 3 3
#11 3 1 a 1 NA
#12 3 4 a 1 1
#13 3 6 b 2 NA
#14 3 8 b 2 2