R 使用向量选择列

R 使用向量选择列,r,list,rowsum,R,List,Rowsum,我试图创建一个包含两列的新数据框:var1和var2,每一列都是数据框sampData中特定列的行和 但当我尝试从向量生成并使用该格式时,如下所示: sampData[ ,c("A","B")] d1_ <-paste(var1, collapse=",") d2_ <-paste(var2, collapse=",") sampData[ ,d1_] 如果我尝试计算行和,我也会得到,这是我感兴趣的结果 data.frame(var1 = rowSums(sampData[ ,

我试图创建一个包含两列的新数据框:var1和var2,每一列都是数据框sampData中特定列的行和

但当我尝试从向量生成并使用该格式时,如下所示:

sampData[ ,c("A","B")]
d1_ <-paste(var1, collapse=",")
d2_ <-paste(var2, collapse=",")

sampData[ ,d1_]
如果我尝试计算行和,我也会得到,这是我感兴趣的结果

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

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

您正在尝试从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")
需要注意的是,cat在屏幕上打印后返回NULL。如果需要连接值,则需要使用“粘贴”或类似方法,但这不适用于您在此处尝试执行的操作

这个问题让我想到了这种解决方案的灵活性,所以这里有一个使用dplyr和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 = "', '")
             , "')])")
    })
  )

谢谢,我已将最后一行更改为此DF3您不应该在列选择中使用粘贴的输出,这是d1_u和d2_u的来源。对于您的示例,您应该使用new.variable1.v和new.variable2.v。如果您有兴趣,请参阅我的编辑,以获得可能更通用的案例解决方案。我还将尝试编辑您的问题,以澄清您试图做的事情。我最近的编辑转换为使用可复制的数据,因为我们无法访问您的sql数据库,并澄清错误消息出现的位置。
data.frame(
  var1sums = rowSums(sampData[, var1])
  , var2sums = rowSums(sampData[, var2])
)
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 = "', '")
             , "')])")
    })
  )