我正在尝试创建一个简单的函数来根据数据帧中称为深度的单个变量对我拥有的数据进行分组。
我创建了以下函数,但是仍然遇到问题。
vecki <- as.array(rep(0,50))
group_AtoD <- function(x){
i<- 1
for(i in 1:55){
if(x$Depths..m.[i] >= 0 & x$Depths..m. <= 1237.5){
vecki[i] <- "D"
i<- i+1
}else if(x$Depths..m.[i] > 1237.5 & x$Depths..m.[i] <= 2475){
vecki[i] <- "C"
i<- i+1
}else if(x$Depths..m.[i] > 2475 & x$Depths..m.[i] <= 3712.5){
vecki[i] <- "B"
i<- i+1
} else if(x$Depths..m.[i] > 3712.5 & x$Depths..m.[i] <= 4950) {
vecki[i] <- "A"
i<- i+1
}
}
return(cbind(x,vecki))
}
我收到以下警告:“条件的长度> 1,并且只会使用第一个元素”
我已经看到该错误出现在其他线程上,但是没有任何建议或答案对我有任何帮助。
它最终运行,但是我正在创建并绑定到原始数据帧的vecki矢量(为了分组)仅具有值D。我在命令行中运行了i,它是56,因此它正在迭代很好。
任何帮助将不胜感激。
谢谢!
编辑::我已经使用与下面类似的功能并利用了which()解决了该问题。我只是想知道,出于教育目的,以下功能为何无法正常工作。再次感谢。
答案 0 :(得分:0)
通过不使用循环,您绝对可以使自己变得更简单。如@ zx8754所述,ifelse
非常有用。我也是dplyr的case_when
的粉丝。例如:
library(dplyr)
my_data <- data_frame(Depths..m. = c(1,4,6,1345, 1211,1,4920,6000,2110,1300,11,2600))
group_AtoD <- function(x){
mutate(x, ID = case_when(
Depths..m. >= 0 & Depths..m. <= 1237.5 ~ "D",
Depths..m. > 1237.5 & Depths..m. <= 2475 ~ "C",
Depths..m. > 2475 & Depths..m. <= 3712.5 ~ "B",
Depths..m. > 3712.5 & Depths..m. <= 4950 ~ "A"
))
}
group_AtoD(my_data)
#> # A tibble: 12 x 2
#> Depths..m. ID
#> <dbl> <chr>
#> 1 1 D
#> 2 4 D
#> 3 6 D
#> 4 1345 C
#> 5 1211 D
#> 6 1 D
#> 7 4920 A
#> 8 6000 <NA>
#> 9 2110 C
#> 10 1300 C
#> 11 11 D
#> 12 2600 B