我需要为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")
答案 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]}