我正在尝试创建一个基于多个条件对数据进行装箱的函数。我的数据有两个变量:max_dist
和activated.
该函数应为不同的容器创建多个向量;检查max_dist
是否落在特定范围内,然后将1
附加到向量上,如果它在该范围内并且activated
是TRUE
或0
如果activated
是FALSE
,则返回列表。
关键部分是对于每个观察,如果max_dist大于指定范围,但是activated
也是TRUE
,那么我想在该bin中包括一个0。因此,一些观察max_dist
值较高的情况将被分档多次。
目前,我的结构是这样的(缩短的版本-全长有6个纸箱):
binning_function <- function(df) {
#create a series of vectors corresponding to bins
two_hundred <- c()
four_hundred <- c()
#iterate through dataframe to add 0 or 1 values to each vector
for (i in 1:nrow(df)) {
if (df$activated[i]==TRUE && df$max_dist[i]<=0.2) {
append(two_hundred, 1)
}
else if (df$max_dist[i]>0.2 || df$activated[i]==FALSE) {
append(two_hundred, 0)
}
}
for (i in 1:nrow(df)) {
if (df$activated[i]==TRUE && df$max_dist[i]>0.2 && df$max_dist[i]<=0.4) {
append(four_hundred, 1)
}
else if (df$max_dist[i]>0.4 || df$activated[i]==FALSE) {
append(four_hundred, 0)
}
}
return(list(two_hundred,four_hundred))
}
当我在数据帧上运行此函数时,它将返回一个列表:
[[1]]
NULL
[[2]]
NULL
答案 0 :(得分:0)
以下解决方案使用apply()
一次对整个数据帧执行操作。这也意味着您不必提前启动一个空向量。
它还使用ifelse()
来缩短长if() {} else {}
的语句:
data <- data.frame(row.names = paste0('s',1:100))
data$max_dist <- runif(100,0,1)
data$activated <- sample(c(T,F),100,replace=T)
binning_function <- function(df) {
two_hundred <- apply(df,1,function(x) {ifelse(x['max_dist']<=0.2 & x['activated'],1,0)})
four_hundred <- apply(df,1,function(x) {ifelse(x['max_dist']<=0.4 & x['max_dist']>0.2 & x['activated'],1,0)})
return(list(two_hundred, four_hundred))
}
binning_function(df=data)