dplyr видоизменяет случай, когда - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть следующие данные:

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))

Я хотел бы использовать mutate для создания нового столбца, который представляет собой сумму значений var1 и var 2, деленную на 2.

Это код, который я должен попробовать и сделать, но он не совсем делает то, что я хочу.

d %>% 
  mutate (Total = case_when (Region == "R1" & Area == "R123" ~
                              sum(var1 & var2)/2),
      case_when (Region == "R2" & Area == "R234" ~
                              sum(var1 & var2)/2)) -> data

Мне нужен только один итоговый столбец, итоговое значение для первой строки должно быть 49, поэтому я не уверен, откуда берется 5.

Спасибо

Ответы [ 4 ]

3 голосов
/ 25 апреля 2019

Вы можете проверить условие вместе в 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))  
2 голосов
/ 25 апреля 2019

При условии, что вы просто хотите применить арифметику ко всем строкам ...

Если вы хотите сохранить все столбцы:

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
1 голос
/ 25 апреля 2019

Не используя ifelse/case_when, мы можем напрямую умножить логический вектор на rowMeans из 'var1', 'var2'

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
0 голосов
/ 25 апреля 2019

Другие уже ответили на вопрос о том, как делать то, что вы хотели бы, но ответили на вопрос о том, откуда 5: Сумма является суммой столбца, а не строкой, и когда вы объединяете переменные с помощью символа &, вы получаете значения TRUE или FALSE (в данном случае TRUE). Когда вычисляется сумма столбца, она равна 10, потому что TRUE имеет числовое значение 1. Затем 10 делится на 2, чтобы получить 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...