dplyr mutate案件何时

时间:2019-04-25 11:30:40

标签: r dplyr

我有以下数据:

INSERT INTO where_to_insert 

我想使用library(reshape2) library(dplyr) d <- tibble( Region = c("R1", "R2", "R3", "R4", "R5", "R1","R2","R3", "R4", "R5"), Area = c("R123","R234", "R345", "R456", "R567", "R123","R234", "R345", "R456", "R567"), var1= c(22, 34, 34, 23, 23, 45, 56, 45, 56, 45), var2= c(76, 34, 56, 76,23, 34, 23, 43, 23, 44)) 创建一个新列,该列是var1和var 2的总和除以2。

这是我必须尝试执行的代码,但是它并没有完全满足我的要求。

mutate

我只想要一个总列,第一行的总值也应该是49,所以我不确定5的来源。

谢谢

4 个答案:

答案 0 :(得分:3)

您可以在case_when中一起检查条件,否则在条件不匹配的情况下返回0。

library(dplyr)

d %>% 
  mutate(Total = case_when((Region == "R1" & Area == "R123") |
                            (Region == "R2" & Area == "R234") ~ (var1 + var2) / 2, 
                            TRUE ~ 0))  

# A tibble: 10 x 5
#  Region Area   var1  var2 Total
#   <chr>  <chr> <dbl> <dbl> <dbl>
# 1 R1     R123     22    76  49  
# 2 R2     R234     34    34  34  
# 3 R3     R345     34    56   0  
# 4 R4     R456     23    76   0  
# 5 R5     R567     23    23   0  
# 6 R1     R123     45    34  39.5
# 7 R2     R234     56    23  39.5
# 8 R3     R345     45    43   0  
# 9 R4     R456     56    23   0  
#10 R5     R567     45    44   0  

在这种情况下,ifelse可以实现相同的目的

d %>% 
  mutate(Total = ifelse((Region == "R1" & Area == "R123") | 
         (Region == "R2" & Area == "R234"), (var1 + var2) / 2,  0))  

答案 1 :(得分:2)

假设您只想对所有行应用算术...

如果要保留所有列:

d %>% 
  mutate(Total=(var1+var2)/2) -> new_d

如果您只想保留新的Total列:

d %>% 
  transmute(Total=(var1+var2)/2) -> new_d


另一方面,如果您想保持示例所用的条件并将总和应用于某些区域...

default = 0       # define the default value for other cases

d %>% 
  mutate(Total=ifelse(Region=="R1" | Region=="R2", (var1+var2)/2, default)) -> new_d

或:

default = 0       # define the default value for other cases

d %>% 
  transmute(Total=ifelse(Region=="R1" | Region=="R2", (var1+var2)/2, default)) -> new_d

答案 2 :(得分:1)

不使用任何ifelse/case_when,我们可以直接将逻辑向量与'{var1','var2'的rowMeans相乘

library(tidyverse)
d %>%
    mutate(Total = (str_c(Region, Area) %in% c("R1R123", "R2R234")) * 
             (var1 + var2)/2)
# A tibble: 10 x 5
#   Region Area   var1  var2 Total
#   <chr>  <chr> <dbl> <dbl> <dbl>
# 1 R1     R123     22    76  49  
# 2 R2     R234     34    34  34  
# 3 R3     R345     34    56   0  
# 4 R4     R456     23    76   0  
# 5 R5     R567     23    23   0  
# 6 R1     R123     45    34  39.5
# 7 R2     R234     56    23  39.5
# 8 R3     R345     45    43   0  
# 9 R4     R456     56    23   0  
#10 R5     R567     45    44   0  

或者在base R

d$Total <- rowMeans(d[3:4]) * (do.call(paste0, d[1:2]) %in% c("R1R123", "R2R234"))
d$Total
#[1] 49.0 34.0  0.0  0.0  0.0 39.5 39.5  0.0  0.0  0.0

答案 3 :(得分:0)

其他人已经回答了如何做自己想做的问题,但是回答了5的来源: 该总和是列总和,而不是行总和,并且当使用&符号组合变量时,将获得TRUEFALSE(在这种情况下为TRUE)的值。当计算列的总和时,它是10,因为TRUE的数值为1。然后将10除以2得到5。