Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R IF_ELSE语句未按预期工作_R_If Statement_Dplyr - Fatal编程技术网

R IF_ELSE语句未按预期工作

R IF_ELSE语句未按预期工作,r,if-statement,dplyr,R,If Statement,Dplyr,我正在尝试创建一个新的变量,它基于对许多其他变量的条件求值。我使用了一些嵌套的“if_else”语句,但条件语句中只有一部分按照我的要求求值 以下是一些示例数据的dput: structure(list(`Cultivation` = c("No", "No", "Yes", "Yes", "No", "Yes", "No", "No", "No", "No", "Yes", "Yes"), `Processing` = c("No", "No", "Yes", "Yes", "No",

我正在尝试创建一个新的变量,它基于对许多其他变量的条件求值。我使用了一些嵌套的“if_else”语句,但条件语句中只有一部分按照我的要求求值

以下是一些示例数据的dput:

structure(list(`Cultivation` = c("No", "No", "Yes", 
"Yes", "No", "Yes", "No", "No", "No", "No", "Yes", "Yes"), 
`Processing` = c("No", 
"No", "Yes", "Yes", "No", "No", "No", "No", "No", "No", "No", 
"Yes"), `Federal Sales` = c("No", "No", "Yes", "Yes", "Yes", 
"Yes", "No", "No", "No", "No", "Yes", "Yes"), `Cultivation 
Type` = c(NA, 
NA, "Standard", "Standard", NA, "Micro", NA, NA, NA, NA, "Nursery", 
"Standard"), `Processing Type` = c(NA, NA, "Standard", 
"Standard", NA, NA, NA, NA, NA, NA, NA, "Standard"), `Type` = c(NA, 
NA, "Standard", "Standard", NA, "Micro", NA, NA, NA, NA, NA, 
"Standard")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-12L))
以下是我正在使用的代码:

DF.2 <- DF.1 %>%
  dplyr::mutate("Type" = if_else(str_detect(tolower(`Cultivation Type`), 
"micro") |

str_detect(tolower(`Processing Type`), "micro"), "Micro",

if_else(str_detect(tolower(`Cultivation Type`), "standard") |

str_detect(tolower(`Processing Type`), "standard"), "Standard",

if_else(str_detect(tolower(`Cultivation Type`), "nursery"), 
"Nursery","Other"))))
DF.2%
dplyr::mutate(“Type”=if_else(str_detect)(tolower(`culturation Type`)),
“微型”)|
str_detect(tolower(`Processing Type`)、“micro”)、“micro”,
如有其他(str_detect(tolower(`栽培类型'),“标准”)|
str_detect(tolower(`Processing Type`),“standard”),“standard”,
如果是其他(str探测(tolower(`culturation Type`)、托儿所),
“托儿所”、“其他”))

满足前两个条件,我得到一个类型变量“standard”或“micro”,但“Turrey”和“other”不计算,我得到“NA”。

在您的情况下,最好使用
case\u,而不是
if\u else
。这里所有的
NA
都导致了
Other

library(dplyr)
library(stringr)

DF.2 <- DF.1 %>%
  mutate("Type" = case_when(
    str_detect(tolower(`Cultivation Type`),"micro") | str_detect(tolower(`Processing Type`), "micro") ~ "Micro",
    str_detect(tolower(`Cultivation Type`), "standard") | str_detect(tolower(`Processing Type`), "standard") ~ "Standard",
    str_detect(tolower(`Cultivation Type`), "nursery") ~ "Nursery",
    TRUE ~ "Other")
  )
库(dplyr)
图书馆(stringr)
DF.2%
变异(“类型”=当(
str_-detect(tolower(`culturation Type`)、micro)| str_-detect(tolower(`Processing Type`)、micro)~“micro”,
str_-detect(tolower(`culturation Type`),“standard”);str_-detect(tolower(`Processing Type`),“standard”)~“standard”,
str_detect(tolower(`culture Type`),“托儿所”)~“托儿所”,
对~“其他”)
)
输出:

> DF.2
# A tibble: 12 x 6
   Cultivation Processing `Federal Sales` `Cultivation Type` `Processing Type` Type    
   <chr>       <chr>      <chr>           <chr>              <chr>             <chr>   
 1 No          No         No              NA                 NA                Other   
 2 No          No         No              NA                 NA                Other   
 3 Yes         Yes        Yes             Standard           Standard          Standard
 4 Yes         Yes        Yes             Standard           Standard          Standard
 5 No          No         Yes             NA                 NA                Other   
 6 Yes         No         Yes             Micro              NA                Micro   
 7 No          No         No              NA                 NA                Other   
 8 No          No         No              NA                 NA                Other   
 9 No          No         No              NA                 NA                Other   
10 No          No         No              NA                 NA                Other   
11 Yes         No         Yes             Nursery            NA                Nursery 
12 Yes         Yes        Yes             Standard           Standard          Standard
> 
DF.2 #一个tibble:12x6 栽培加工`联邦销售``栽培类型``加工类型` 1不,不,不,不,不,其他 2不,不,不,不,不,其他 3是是标准是标准 4是是标准是标准 5否否否否否其他 6是否是微纳微纳 7不,不,不,不,不,其他 8不,不,不,不,不,其他 9不,不,不,不,不,其他 10不,不,不,不,不,不,其他 11是不是是托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所托儿所 12是是是标准 >
由于
NA
元素只返回
NA
,我们需要对代码进行一些更改,以仅返回
TRUE/FALSE
,这可能会导致问题

library(dplyr)
DF.1 %>%
  dplyr::mutate("Type" = if_else((str_detect(tolower(`Cultivation Type`), "micro") | str_detect(tolower(`Processing Type`), "micro")) & !(is.na(`Cultivation Type`) |  is.na(`Processing Type`)), "Micro",

     if_else((str_detect(tolower(`Cultivation Type`), "standard") | str_detect(tolower(`Processing Type`), "standard")) & !(is.na(`Cultivation Type`) | is.na(`Processing Type`)), "Standard",

     if_else(str_detect(tolower(`Cultivation Type`), "nursery") & !is.na(`Cultivation Type`),  "Nursery","Other"))))
# A tibble: 12 x 6
#   Cultivation Processing `Federal Sales` `Cultivation Type` `Processing Type` Type    
#   <chr>       <chr>      <chr>           <chr>              <chr>             <chr>   
# 1 No          No         No              <NA>               <NA>              Other   
# 2 No          No         No              <NA>               <NA>              Other   
# 3 Yes         Yes        Yes             Standard           Standard          Standard
# 4 Yes         Yes        Yes             Standard           Standard          Standard
# 5 No          No         Yes             <NA>               <NA>              Other   
# 6 Yes         No         Yes             Micro              <NA>              Other   
# 7 No          No         No              <NA>               <NA>              Other   
# 8 No          No         No              <NA>               <NA>              Other   
# 9 No          No         No              <NA>               <NA>              Other   
#10 No          No         No              <NA>               <NA>              Other   
#11 Yes         No         Yes             Nursery            <NA>              Nursery 
#12 Yes         Yes        Yes             Standard           Standard          Standard


如果我们对其他更简单的选项感兴趣,另一个选项是创建一个键/val数据集,然后进行模糊连接

该列中有
NA
,需要注意如果有许多值需要替换,那么一个选项将是键/val数据集,然后进行模糊连接我认为NA可能是我的问题的原因。您知道为什么第6行会正确地对Micro-tough进行evaluation,因为其中一列也包含“NA”吗?还有,有没有一种方法可以处理嵌套if_else语句中的NA?这很好。我从来没有用过case_when,但它看起来正是我所需要的。我们将进一步研究文档。谢谢。很高兴能帮上忙。它确实是非常方便的多案例转换!
DF.1 %>% 
    mutate_at(vars(ends_with('Type')), replace_na, 'new') %>% 
   dplyr::mutate("Type" = if_else(str_detect(tolower(`Cultivation Type`), 
 "micro") |

 str_detect(tolower(`Processing Type`), "micro"), "Micro",

 if_else(str_detect(tolower(`Cultivation Type`), "standard") |

 str_detect(tolower(`Processing Type`), "standard"), "Standard",

 if_else(str_detect(tolower(`Cultivation Type`), "nursery"), 
 "Nursery","Other")))) %>% 
   mutate_at(vars(ends_with('Type')), na_if, 'new')