我有以下数据:
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的来源。
谢谢
答案 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的来源:
该总和是列总和,而不是行总和,并且当使用&符号组合变量时,将获得TRUE
或FALSE
(在这种情况下为TRUE
)的值。当计算列的总和时,它是10,因为TRUE
的数值为1。然后将10除以2得到5。