我想做一张危险等级的表格。如果风险级别小于10,那么它将是危险级别"I",风险level<100 = II,风险level<1000 = III,风险级别> 1000 = IV。一开始我做了一个空栏
Hazard_level <- c()然后,我做出如下声明
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)它显示的错误是
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
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)发布于 2021-08-27 17:28:21
我们可以使用dplyr包中的case_when函数:
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'))输出:
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发布于 2021-08-27 17:29:10
在base R中,您可以使用cut,如下所示:
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另一种方法是:
df$Hazard_Level <- c('I', 'II', 'III', 'IV')[findInterval(df$Risk_value, c(-Inf, 10, 100, 1000, Inf))]发布于 2021-08-27 17:32:28
是的,你可以使用基础r中的函数,比如:记得为管道“%>%”加载magrittr或dplyr。
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"))))https://stackoverflow.com/questions/68957242
复制相似问题