【问题标题】:Create formula inside loop over column names在列名的循环内创建公式
【发布时间】:2020-01-31 18:00:21
【问题描述】:

我想遍历数据集中的列并使用列的名称来聚合数据集。但是,当我尝试将列名输入聚合函数时出现错误:

"model.frame.default(formula = cbind(SurveyID) ~ Panel + Category + 中的错误: 可变长度不同(为 'i' 找到)"

一旦我可以存储这是一个临时文件,我会将临时文件添加到永久数据集;但是,我无法通过这部分。任何帮助将不胜感激!

#example of my data:
    df <- data.frame("SurveyID" = c('A','B','C','D'), "Panel" = c('E','E','S','S'), "Category" = c(1,1,2,3), "ENG" = c(3,3,1,2), "PAR"
    = c(3,1,1,2), "REL" = c(3,1,1,2), "CLC"= c(3,1,1,2))

#for loop to get column name to include as part of the aggregate function
    for (i in colnames(df[4:7])) {
      print (i)
     temp <-  data.frame(setNames(aggregate(cbind(SurveyID) ~ Panel + Category + i, data = df, FUN = length), c("Panel","GENDER", "Favlev", "Cnt")))       
}

【问题讨论】:

  • 我相信这种情况正在发生,因为您在循环中拥有的 i 不在您为其制定该公式的数据框的范围内。我认为aggregate 使用非标准评估来找到公式的值。或者,您可以在调用聚合之前制定公式,例如 as.formula(paste(...+ Category + i))
  • 你可以尝试用df[[i]]替换“i”
  • 替换 df[[i]] 有效。我还在学习 R-为什么它需要双 []。我在发布之前只使用了一个 [] 进行了尝试,但也出现了错误。
  • [ ] 正在寻找索引号,双[[ ]] 将接受将取一个名称,在这种情况下很有用。请参阅?[[ 了解更多信息
  • @Dave2e "[" 和 "[[" 都可以接受名称参数。它们的不同之处在于返回值的类型。

标签: r for-loop aggregate columnname


【解决方案1】:

你犯了一个新手错误和一个更复杂的错误:

Newb 错误:在赋值时未能索引连续的项目,即用新值覆盖以前的值。

不是那么新的错误。公式对象的构造不当。需要as.formula

temp=list()   # need empty list with a name
for (i in colnames(df[4:7])) {
     print (i); form <- as.formula( paste( "SurveyID ~ Panel + Category +", i) )
     temp[[i]] <-  data.frame(setNames(aggregate(form, data = df, FUN = length), c("Panel","GENDER", "Favlev", "Cnt")))       
 }
#Output
[1] "ENG"
[1] "PAR"
[1] "REL"
[1] "CLC"

 str(temp)
#----------------
List of 4
 $ ENG:'data.frame':    3 obs. of  4 variables:
  ..$ Panel : Factor w/ 2 levels "E","S": 2 2 1
  ..$ GENDER: num [1:3] 2 3 1
  ..$ Favlev: num [1:3] 1 2 3
  ..$ Cnt   : int [1:3] 1 1 2
 $ PAR:'data.frame':    4 obs. of  4 variables:
  ..$ Panel : Factor w/ 2 levels "E","S": 1 2 2 1
  ..$ GENDER: num [1:4] 1 2 3 1
  ..$ Favlev: num [1:4] 1 1 2 3
  ..$ Cnt   : int [1:4] 1 1 1 1
 $ REL:'data.frame':    4 obs. of  4 variables:
  ..$ Panel : Factor w/ 2 levels "E","S": 1 2 2 1
  ..$ GENDER: num [1:4] 1 2 3 1
  ..$ Favlev: num [1:4] 1 1 2 3
  ..$ Cnt   : int [1:4] 1 1 1 1
 $ CLC:'data.frame':    4 obs. of  4 variables:
  ..$ Panel : Factor w/ 2 levels "E","S": 1 2 2 1
  ..$ GENDER: num [1:4] 1 2 3 1
  ..$ Favlev: num [1:4] 1 1 2 3
  ..$ Cnt   : int [1:4] 1 1 1 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多