首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决这个if else语句并将数据合并到一个dataframe中?

如何解决这个if else语句并将数据合并到一个dataframe中?
EN

Stack Overflow用户
提问于 2021-08-27 17:19:42
回答 3查看 23关注 0票数 1

我想做一张危险等级的表格。如果风险级别小于10,那么它将是危险级别"I",风险level<100 = II,风险level<1000 = III,风险级别> 1000 = IV。一开始我做了一个空栏

代码语言:javascript
复制
Hazard_level <- c()

然后,我做出如下声明

代码语言:javascript
复制
for(i in 1:lenght(data$Risk_value)){
  if(data$Risk_value[i] < 10){
    Hazard_Level <- append(Hazard_Level, 'I')
  }
  elseif(data$Risk_value[i] < 100){
    Hazard_Level <- append(Hazard_Level, 'II')
  }
  elseif(data$Risk_value[i] < 1000){
    Hazard_Level <- append(Hazard_Level, 'III')
  }
  else{
    Hazard_Level <- append(Hazard_Level, 'IV')
  }
}
df <- as.data.frame(Hazard_Level)
df1 <- cbind(data,df)

它显示的错误是

代码语言:javascript
复制
Error: unexpected symbol in:
> for(i in 1:lenght(data$Risk_value)){
+   if(data$Risk_value[i] < 10){
+     Hazard_Level <- append(Hazard_Level, 'I')
+   }
+   elseif(data$Risk_value[i] < 100){
Error: unexpected '{' in:
"  }
  elseif(data$Risk_value[i] < 100){"
>     Hazard_Level <- append(Hazard_Level, 'II')
>   }
Error: unexpected '}' in "  }"
>   elseif(data$Risk_value[i] < 1000){
Error: unexpected '{' in "  elseif(data$Risk_value[i] < 1000){"
>     Hazard_Level <- append(Hazard_Level, 'III')
>   }
Error: unexpected '}' in "  }"
>   else{
Error: unexpected 'else' in "  else"
>     Hazard_Level <- append(Hazard_Level, 'IV')
>   }
Error: unexpected '}' in "  }"
> }
Error: unexpected '}' in "}"
> df1 = cbind(data,df)
Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 23, 24

我使用的数据是was

代码语言:javascript
复制
structure(list(Station = c("LJDZ05", "LJDZ06", "LJDZ07", "LJDZ08", 
"LJDZ09", "LJDZ11", "LJDZ17", "LJDZ18", "LJDZ19", "LJDZ20", "LJDZ21", 
"LJDZ23", "LJDZ25", "LJDZ36", "LJDZ38", "LJDZ39", "LJDZ40", "LJDZ42", 
"LJDZ44", "LJDZ51", "LJDZ52", "LJDZ54", "LJDZ56"), Risk_value = c(26.62730994, 
1.068631579, 0.672, 3.407157895, 56.34514286, 0.584571429, 9.621879699, 
2.343035446, 2.177154135, 2.235609023, 6.438646617, 14.20606015, 
44.53034586, 22.44414608, 37.19215489, 33.58984127, 13.11310276, 
12.42682707, 89.37153383, 63.10576441, 81.76046115, 13.11488487, 
40.82847118)), class = "data.frame", row.names = c(NA, -23L)
EN

回答 3

Stack Overflow用户

发布于 2021-08-27 17:28:21

我们可以使用dplyr包中的case_when函数:

代码语言:javascript
复制
library(dplyr)
df %>% 
    mutate(Risk_level = case_when(Risk_value < 10 ~ 'I',
                                 Risk_value >=  10 & Risk_value < 100 ~ 'II',
                                 Risk_value >= 100 & Risk_value < 1000 ~ 'III',
                                 Risk_value >= 1000 ~ 'IV'))

输出:

代码语言:javascript
复制
   Station Risk_value Risk_level
1   LJDZ05 26.6273099         II
2   LJDZ06  1.0686316          I
3   LJDZ07  0.6720000          I
4   LJDZ08  3.4071579          I
5   LJDZ09 56.3451429         II
6   LJDZ11  0.5845714          I
7   LJDZ17  9.6218797          I
8   LJDZ18  2.3430354          I
9   LJDZ19  2.1771541          I
10  LJDZ20  2.2356090          I
11  LJDZ21  6.4386466          I
12  LJDZ23 14.2060602         II
13  LJDZ25 44.5303459         II
14  LJDZ36 22.4441461         II
15  LJDZ38 37.1921549         II
16  LJDZ39 33.5898413         II
17  LJDZ40 13.1131028         II
18  LJDZ42 12.4268271         II
19  LJDZ44 89.3715338         II
20  LJDZ51 63.1057644         II
21  LJDZ52 81.7604611         II
22  LJDZ54 13.1148849         II
23  LJDZ56 40.8284712         II
票数 2
EN

Stack Overflow用户

发布于 2021-08-27 17:29:10

在base R中,您可以使用cut,如下所示:

代码语言:javascript
复制
df$Hazard_Level <- cut(df$Risk_value, breaks =c(-Inf, 10, 100, 1000, Inf), 
                                      labels = c('I', 'II', 'III', 'IV')) 
df
   Station Risk_value Hazard_Level
1   LJDZ05 26.6273099           II
2   LJDZ06  1.0686316            I
3   LJDZ07  0.6720000            I
4   LJDZ08  3.4071579            I
5   LJDZ09 56.3451429           II
6   LJDZ11  0.5845714            I
7   LJDZ17  9.6218797            I
8   LJDZ18  2.3430354            I
9   LJDZ19  2.1771541            I
10  LJDZ20  2.2356090            I
11  LJDZ21  6.4386466            I
12  LJDZ23 14.2060602           II
13  LJDZ25 44.5303459           II
14  LJDZ36 22.4441461           II
15  LJDZ38 37.1921549           II
16  LJDZ39 33.5898413           II
17  LJDZ40 13.1131028           II
18  LJDZ42 12.4268271           II
19  LJDZ44 89.3715338           II
20  LJDZ51 63.1057644           II
21  LJDZ52 81.7604611           II
22  LJDZ54 13.1148849           II
23  LJDZ56 40.8284712           II

另一种方法是:

代码语言:javascript
复制
df$Hazard_Level <- c('I', 'II', 'III', 'IV')[findInterval(df$Risk_value, c(-Inf, 10, 100, 1000, Inf))]
票数 1
EN

Stack Overflow用户

发布于 2021-08-27 17:32:28

是的,你可以使用基础r中的函数,比如:记得为管道“%>%”加载magrittrdplyr

代码语言:javascript
复制
library(dplyr)

new_df <- df %>% mutate(Hazard_Level = ifelse(Risk_value  < 10,
                                    yes = "I",
                                    no = ifelse(Risk_value >= 10 & Risk_value < 100,
                                           yes = "II",
                                           no = ifelse(Risk_value >= 100 & Risk_value < 1000,
                                                       yes = "III",
                                                       no = "IV"))))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68957242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档