2014-11-21 2 views
0

Мне нужно построить новый столбец для фрейма данных R, который поможет в агрегации.Создание столбца для агрегирования в r dataframe

Во-первых, у меня есть несколько векторов:

vector1 <- c("ITEM11","ITEM12","ITEM13") 
vector2 <- c("ITEM21","ITEM22","ITEM32") 

и dataframe DF, который имеет столбец УАК с позиции, включенные в векторах. Теперь я хочу сделать новую колонку AGGVAR:

DF$AGGVAR[DF$VAR %in% vector1] <- "vector1" 

это решаемая с небольшим количеством векторов, но я хочу, чтобы это сделать аккуратнее для более векторов. Я сделал список

vectorList <- ls(pattern = "^vector") 

и моя, очевидно, наивная попытка была

for(i in regList){DF$AGGVAR[DF$VAR %in i] <- i} 

Что еще нужно, чтобы сделать эту работу?

EDIT: Моя проблема была на самом деле немного более волосатой, чем я впервые представил. Векторы на самом деле не имеют аккуратные числовые суффиксы, например:

vectorGHI <- c("ITEM11","ITEM12","ITEM13") 
vectorJKL <- c("ITEM21","ITEM22","ITEM32") 

ответ

2

Что-то вроде этого следует сделать трюк:

vector1 <- c("ITEM11","ITEM12","ITEM13") 
vector2 <- c("ITEM21","ITEM22","ITEM32") 

d <- data.frame(var=c(vector1, vector2)) 
L <- mget(ls(patt='^vector')) 
d$aggvar <- paste0('vector', sapply(d$var, grep, L)) 

d 
#  var aggvar 
# 1 ITEM11 vector1 
# 2 ITEM12 vector1 
# 3 ITEM13 vector1 
# 4 ITEM21 vector2 
# 5 ITEM22 vector2 
# 6 ITEM32 vector2 

Альтернативой, которая может иметь более высокую производительность:

lookup <- cbind(unlist(L), 
       c(mapply(rep, names(L), sapply(L, length)))) 

d$aggvar <- lookup[match(d$var, lookup[, 1]), 2] 
0

Немного измененный ответ на основе предложения jbaums, чтобы сделать это:

namesVectors <- ls(pattern = "^vector") 
vectorList <- mget(namesVectors) 
# Getting rid of auxiliary prefix 
namesVectors <- substring(namesVectors, 7) 

DF$AGGVAR <- sapply(DF$VAR, grep, vectorList) 
for(i in length(namesVectors)) {DF$AGGVAR[DF$AGGVAR == i] <- namesVectors[i]}