首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >条件子数

条件子数
EN

Stack Overflow用户
提问于 2018-06-23 01:55:27
回答 2查看 44关注 0票数 0

我有这样的数据框架

代码语言:javascript
运行
复制
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相加,并在此手术后需要连续下降。

我希望有一个新的一栏,这是连续下降,随着这一增长。所以我试着

代码语言:javascript
运行
复制
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

但我需要的是这样

代码语言:javascript
运行
复制
 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

我不知道如何连续下降?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-23 02:18:03

这不是最优雅的答案,但同时,这可能会奏效:

代码语言:javascript
运行
复制
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),只得到grNoNew_Column。我留下其他专栏只是为了显示发生了什么。

如果您想将它包装成一个函数,您可以这样做:

代码语言:javascript
运行
复制
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

票数 1
EN

Stack Overflow用户

发布于 2018-06-23 02:58:37

下面是在base R中实现此操作的一种方法

代码语言:javascript
运行
复制
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略有不同

代码语言:javascript
运行
复制
with(test, No + c(100, 50)[match(gr, unique(gr))] - 2*(No %% 100))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50997311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档