Select 列使用向量

Select columns using a vector

我正在尝试创建一个包含 2 列的新数据框:var1var2,其中每一列都是数据框 sampData 中特定列的行总和。

library(dplyr)

sampData <-
  rnorm(260) %>%
  matrix(ncol = 26) %>%
  data.frame() %>%
  setNames(LETTERS)

var1 <- c("A", "B", "C")
var2 <- c("D", "E", "F", "G")

我知道我可以使用 []c() select 列,像这样:

sampData[ ,c("A","B")]

但是当我尝试从我的向量中生成并使用该格式时:

d1_ <-paste(var1, collapse=",")
d2_ <-paste(var2, collapse=",")

sampData[ ,d1_]

我收到这个错误:

Error in `[.data.frame`(sampData, , d1_) : undefined columns selected

如果我尝试计算 rowSums,我也会得到 - 这是我感兴趣的。

data.frame(var1 = rowSums(sampData[ , d1_])
           , var2 = rowSums(sampData[ , d2_])

我想我已经弄清楚你在问什么,但如果我错了,请告诉我。

您正在尝试 prep 中与 l1l2 中的值匹配的 select 列,并对各行求和,仅限于匹配的列每个。

提供可重现的数据总是更好,这里有一些针对这种情况的数据(使用 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 将 return 第三列)。

data.frame(
  var1sums = rowSums(sampData[, var1])
  , var2sums = rowSums(sampData[, var2])
)

注意,cat returns NULL 打印到屏幕后。如果您需要连接值,则需要使用 paste(或类似的),但这 不会 对您在此处尝试执行的操作有效。

这个问题让我开始思考此类解决方案的灵活性,因此这里尝试使用 dplyrtidyr,这实际上产生了相同的结果。不同之处在于,这可能为变量 selection 甚至下游处理提供更大的灵活性。

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 = "', '")
             , "')])")
    })
  )