我有这样的数据框架
test <- data.frame(gr=rep(letters[1:2],each=6),No=c(100:105,200:205))
gr No
1 a 100
2 a 101
3 a 102
4 a 103
5 a 104
6 a 105
7 b 200
8 b 201
9 b 202
10 b 203
11 b 204
12 b 205在No列中,每个gr中的数字都在增加。我需要将gr a与100和b与50相加,并在此手术后需要连续下降。
我希望有一个新的一栏,这是连续下降,随着这一增长。所以我试着
decrese_func <- function(No,gr){
if(any(gr=="a")){
No+100
}
else
No+50
}
test%>%
group_by(gr)%>%
mutate(new_column=decrese_func(No,gr))
# A tibble: 12 x 3
# Groups: gr [2]
gr No new_column
<fct> <int> <dbl>
1 a 100 200
2 a 101 201
3 a 102 202
4 a 103 203
5 a 104 204
6 a 105 205
7 b 200 250
8 b 201 251
9 b 202 252
10 b 203 253
11 b 204 254
12 b 205 255但我需要的是这样
gr No new_column
<fct> <int> <dbl>
1 a 100 200
2 a 101 199
3 a 102 198
4 a 103 197
5 a 104 196
6 a 105 195
7 b 200 250
8 b 201 249
9 b 202 248
10 b 203 247
11 b 204 246
12 b 205 245我不知道如何连续下降?
谢谢。
发布于 2018-06-23 02:18:03
这不是最优雅的答案,但同时,这可能会奏效:
library(dplyr)
test %>%
mutate(A = case_when(gr == "a" ~ 100,
gr == "b" ~ 50,
TRUE ~ NA_real_)) %>%
group_by(gr) %>%
mutate(B = (1:NROW(gr) - 1) * 2,
New_Column = No + A - B)1×5#组: gr 2 gr No A B New_Column 1 a 100 0 200 2 a 101 100 2 199 3 a 102 100 4 198 4 a 103 100 6 197 5 a 104 100 8 196 6 a 105 100 10195 7 b 200 50 0 250 8 b 201 50 2 249 9 b 202 50 4 248 10 b 203 50 6 247 11 b 204 50 8 246 12 b 205 50 10 245
在链的末尾添加select(gr, No, New_Column),只得到gr、No和New_Column。我留下其他专栏只是为了显示发生了什么。
如果您想将它包装成一个函数,您可以这样做:
desc_func <- function(group_var, condition, if_true_add, if_false_add, to_number) {
ifelse(
group_var == condition,
to_number + if_true_add - (1:NROW(group_var) - 1) * 2,
to_number + if_false_add - (1:NROW(group_var) - 1) * 2)
}
test %>%
group_by(gr) %>%
mutate(test_var = desc_func(gr, "a", 100, 50, No))1×3#组: gr 2 gr No test_var 1 a 100 200 2 a 101 199 3 a 102 198 4 a 103 197 5 a 104 196 6 a 105 195 7 b 200 250 8 b 201 249 9 b 202 248 b 203 247 11 b204 246 12 b 205 245
发布于 2018-06-23 02:58:37
下面是在base R中实现此操作的一种方法
test$New <- with(test, No + c(100, 50)[cumsum(!duplicated(gr))] - 2*(No %% 100))
test$New
#[1] 200 199 198 197 196 195 250 249 248 247 246 245或与match略有不同
with(test, No + c(100, 50)[match(gr, unique(gr))] - 2*(No %% 100))https://stackoverflow.com/questions/50997311
复制相似问题