制作一个列以帮助r数据帧中的聚合

时间:2014-11-21 12:18:12

标签: r dataframe

我需要为R dataframe构建一个新列,以帮助聚合。

首先,我有一些载体:

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

和数据框DF,其中列VAR包含向量中包含的项目。现在我想制作新的AGGVAR列:

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

这可以通过少量载体进行管理,但我想让它更适合更多载体。我做了清单

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

我明显天真的尝试是

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

使这项工作仍需要什么?

编辑:我的问题实际上比我第一次提出的要多毛茸茸。这些载体实际上没有简洁的数字后缀,例如:

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

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

基于jbaums的轻微修改答案&#39;建议完成这个:

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]}