我想我已经设法弄清楚你在问什么,但如果我错了,请告诉我。
您正在尝试从与 和 中的值匹配的列中选择列,prep
并对各行求和,仅限于与每个匹配的列。l1
l2
提供可重现的数据总是更好,这里有一些适用于这种情况(dplyr
用于构建它):
sampData <-
rnorm(260) %>%
matrix(ncol = 26) %>%
data.frame() %>%
setNames(LETTERS)
var1 <- c("A", "B", "C")
var2 <- c("D", "E", "F", "G")
然后,您根本不需要连接列索引 - 只需直接使用变量(或列,在您的情况下)。在这里,我已经制作了 ID 的字母,并将匹配这些字母。但是,如果您的 ID 是数字,它将匹配该索引(例如,3
将返回第三列)。
data.frame(
var1sums = rowSums(sampData[, var1])
, var2sums = rowSums(sampData[, var2])
)
值得注意的是,打印到屏幕后cat
返回。NULL
如果您需要连接值,则需要使用paste
(或类似的),但这不适用于您在此处尝试执行的操作。
这个问题让我想到了这种解决方案的灵活性,所以这里尝试使用dplyr
and tidyr
,它有效地产生了相同的结果。不同之处在于,这可以为变量选择甚至下游处理提供更大的灵活性。
sampData %>%
# add column for individual
mutate(ind = 1:nrow(.)) %>%
# convert data to long format
gather("Variable", "Value", -ind) %>%
# Set to group by the individual we added above
group_by(ind) %>%
# Calculate sums as desired
summarise(
var1sums = sum(Value[Variable %in% var1])
, var2sums = sum(Value[Variable %in% var2])
)
但是,如果您有任意数量(或通常只是大量)想要从中获取单个总和的变量集,那么真正的优势就会出现。您可以使用标准评估(相对于非标准评估)根据命名的向量列表自动生成列,而不是手动构建您可能感兴趣的每一列:
sampData %>%
mutate(ind = 1:nrow(.)) %>%
gather("Variable", "Value", -ind) %>%
group_by(ind) %>%
# Calculate one column for each vector in `varList`
summarise_(
.dots = lapply(varList, function(x){
paste0("sum(Value[Variable %in% c('"
, paste(x, collapse = "', '")
, "')])")
})
)