-1

我正在尝试创建一个包含 2 列的新数据框:var1并且var2,它们中的每一列都是数据框中特定列的行总和sampData

library(dplyr)

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

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

我知道我可以使用[]and选择列c(),如下所示:

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_])
4

1 回答 1

0

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

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

提供可重现的数据总是更好,这里有一些适用于这种情况(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(或类似的),但这不适用于您在此处尝试执行的操作。

这个问题让我想到了这种解决方案的灵活性,所以这里尝试使用dplyrand 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 = "', '")
             , "')])")
    })
  )
于 2016-10-06T18:34:23.193 回答