我经常遇到如何根据数据框中的某些值(例如数字,因子字符串等)从数据框列表中对数据框进行分类的问题。我在这里使用矢量的简化版本。
为这个任务写了一堆乱码的循环后,我试着写一个函数来反复解决这个问题。下面的代码返回一个下标错误(在底部给出),但我不认为这是一个下标问题,而是与我使用return相关。
除了解决这个问题之外,我非常感谢有关是否有更清洁/更好的方法来编写此功能的任何指示。
library(plyr)
library(dplyr)
#dummy data
segmentvalues <- c('1_P', '2_B', '3_R', '4_M', '5_D', '6_L')
trialvec <- vector()
for (i in 1:length(segmentvalues)){
for (j in 1:20) {
trialvec[i*j] <- segmentvalues[i]
}
}
#vector categorisation
vcategorise <- function(categories, data) {
#categorises a vector into a list of vectors
#requires plyr and dyplyr
assignment <- list()
catlength <- length(categories)
for (i in 1:length(catlength)){
for (j in 1:length(data)) {
if (any(contains(categories[i], ignore.case = TRUE,
as.vector(data[j])))) {
assignment[[i]][j] <- data[j]
}
}
}
return (assignment)
}
result <- vcategorise(categories = segmentvalues, data = trialvec)
*tmp*
[[i]]:下标超出范围
答案 0 :(得分:1)
你正在索引assignments
- 这是好的,即使在一个没有值的索引上,只是给你NULL
- 然后索引你到达那里 - - 如果获得NULL
,将不会工作。你会得到NULL
,因为你没有将列表分配到合适的大小。
无论如何,我认为你没有必要分配一个表。您已经在测试数据生成中使用了平面索引结构,那么为什么不对assignment
执行相同的操作,然后再设置其尺寸呢?
也许是这样的事情?
vcategorise <- function(categories, data) {
assignment <- vector("list", length = length(data) * length(categories))
n <- length(data)
for (i in 1:length(categories)){
for (j in 1:length(data)) {
assignment[(i-1)*n + j] <-
if (any(contains(categories[i],
ignore.case = TRUE,
as.vector(data[j])))) {
data[j]
} else {
NA
}
}
}
dim(assignment) <- c(length(data), length(categories))
assignment
}
这不是最漂亮的代码,但如果没有完全理解你想要实现的目标,我不知道如何进一步发展。