• R语言
  • R语言 ifelse or For迭代问题

这是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语言形式:
第一种
2.png
第二种
2.png
尝试过两种写法结果都不对,请问各位老师同学,需要怎么改呀?有其它的方法也可以

你的第一种写法看起来没啥问题啊,有什么报错吗?

除了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>

    8 天 后

    henrywangnl 第一种没有报错,但实际结果和excel计算出的结果差异有点大,,我试试你说的方法,谢谢解答。

      1 个月 后

      Hinton 自已的体会,看到你公式中有=0的情况,不知道你有没有仔细看过原始数据是否有空格的情况。excel中,空格是默认为0的,按你写的excel公式即使某个格子是空格,是会按0给出最终结果的。但你如果将excel导入R中,空格的数据则是NA,不会被纳入转换的。