- 已编辑
这是excel的公式:
=IF(T2<=0,"否", IF(AND(G2="A物品",OR(BM2>120,AB2=0,BL>50)),"是", IF(AB2=0, IF(AND(T2>0,BM2>180),"是","否"), IF(AND(BL2>50,BM2>90),"是","否"))))
现在我想要改写成R语言形式:
第一种
第二种
尝试过两种写法结果都不对,请问各位老师同学,需要怎么改呀?有其它的方法也可以
这是excel的公式:
=IF(T2<=0,"否", IF(AND(G2="A物品",OR(BM2>120,AB2=0,BL>50)),"是", IF(AB2=0, IF(AND(T2>0,BM2>180),"是","否"), IF(AND(BL2>50,BM2>90),"是","否"))))
现在我想要改写成R语言形式:
第一种
第二种
尝试过两种写法结果都不对,请问各位老师同学,需要怎么改呀?有其它的方法也可以
你的第一种写法看起来没啥问题啊,有什么报错吗?
除了ifelse()也可以用case_when():
library(dplyr)
#> Warning: replacing previous import 'vctrs::data_frame' by 'tibble::data_frame'
#> when loading 'dplyr'
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(tidyr)
# 造数据方便测试
tb <- tibble(
T2 = c(0, 1, 3, 4),
G2 = c("A物品", "B物品", "C物品", "D物品"),
BM2 = c(130, 110, 200, 80),
AB2 = c(0, 1, 2, 3),
BL = c(60, 40, 50, 70),
BL2 = c(60, 40, 50, 70)
)
tb
#> # A tibble: 4 x 6
#> T2 G2 BM2 AB2 BL BL2
#> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 0 A物品 130 0 60 60
#> 2 1 B物品 110 1 40 40
#> 3 3 C物品 200 2 50 50
#> 4 4 D物品 80 3 70 70
data <- tb %>%
expand(T2, G2, BM2, AB2, BL, BL2)
data
#> # A tibble: 4,096 x 6
#> T2 G2 BM2 AB2 BL BL2
#> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 0 A物品 80 0 40 40
#> 2 0 A物品 80 0 40 50
#> 3 0 A物品 80 0 40 60
#> 4 0 A物品 80 0 40 70
#> 5 0 A物品 80 0 50 40
#> 6 0 A物品 80 0 50 50
#> 7 0 A物品 80 0 50 60
#> 8 0 A物品 80 0 50 70
#> 9 0 A物品 80 0 60 40
#> 10 0 A物品 80 0 60 50
#> # … with 4,086 more rows
# ifelse() 方法
new_data_1 <- data %>%
mutate(
var = ifelse(T2 <= 0, "否",
ifelse(G2 == "A物品" & (BM2 > 120 | AB2 == 0 | BL > 50), "是",
ifelse(AB2 == 0,
ifelse(T2 > 0 & BM2 > 180, "是", "否"),
ifelse(BL2 > 50 & BM2 > 90, "是", "否"))))
)
new_data_1
#> # A tibble: 4,096 x 7
#> T2 G2 BM2 AB2 BL BL2 var
#> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1 0 A物品 80 0 40 40 否
#> 2 0 A物品 80 0 40 50 否
#> 3 0 A物品 80 0 40 60 否
#> 4 0 A物品 80 0 40 70 否
#> 5 0 A物品 80 0 50 40 否
#> 6 0 A物品 80 0 50 50 否
#> 7 0 A物品 80 0 50 60 否
#> 8 0 A物品 80 0 50 70 否
#> 9 0 A物品 80 0 60 40 否
#> 10 0 A物品 80 0 60 50 否
#> # … with 4,086 more rows
new_data_1 %>%
count(var)
#> # A tibble: 2 x 2
#> var n
#> <chr> <int>
#> 1 否 2644
#> 2 是 1452
# case_when() 方法
new_data_2 <- data %>%
mutate(var = case_when(
T2 <= 0 ~ "否",
G2 == "A物品" & (BM2 > 120 | AB2 == 0 | BL > 50) ~ "是",
AB2 == 0 & (T2 > 0 & BM2 > 180) ~ "是",
AB2 == 0 & !(T2 > 0 & BM2 > 180) ~ "否",
AB2 != 0 & (BL2 > 50 & BM2 > 90) ~ "是",
AB2 != 0 & !(BL2 > 50 & BM2 > 90) ~ "否",
TRUE ~ NA_character_
))
new_data_2
#> # A tibble: 4,096 x 7
#> T2 G2 BM2 AB2 BL BL2 var
#> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1 0 A物品 80 0 40 40 否
#> 2 0 A物品 80 0 40 50 否
#> 3 0 A物品 80 0 40 60 否
#> 4 0 A物品 80 0 40 70 否
#> 5 0 A物品 80 0 50 40 否
#> 6 0 A物品 80 0 50 50 否
#> 7 0 A物品 80 0 50 60 否
#> 8 0 A物品 80 0 50 70 否
#> 9 0 A物品 80 0 60 40 否
#> 10 0 A物品 80 0 60 50 否
#> # … with 4,086 more rows
new_data_2 %>%
count(var)
#> # A tibble: 2 x 2
#> var n
#> <chr> <int>
#> 1 否 2644
#> 2 是 1452
<sup>Created on 2020-11-05 by the reprex package (v0.3.0)</sup>
henrywangnl 第一种没有报错,但实际结果和excel计算出的结果差异有点大,,我试试你说的方法,谢谢解答。