【问题标题】:R: loop through variable names in data.table using for-loop (and group them by variable)R:使用for循环遍历data.table中的变量名(并按变量分组)
【发布时间】:2019-12-29 06:13:36
【问题描述】:
> colnames(fileIWantToAnalyze) 

[1] "variable_1a"     "variable_5b"                                  
[3] "variable_1b"     "variable_6a"                           
[5] "variable_2a"     "variable_6b"                           
[7] "variable_2b"     "variable_7a"                           
[9] "variable_3a"     "variable_7b"                           
[11] "variable_3b"    "variable_8a"        
[13] "variable_4a"    "variable_8b"       
[15] "variable_4b"    "variable_9a"            
[17] "variable_5a"    "variable_9b"            
[19] "GroupingColumn1"

我无法在 R 中运行以下代码 - 引发此错误:

[.data.table(fileIWantToAnalyze, , .(mean1 = mean(get(attribute)), 中的错误:“by”或“keyby”列表中的项目是长度 (943026,1)。每个必须是长度 943026;与 x 中的行长度相同(如果提供了 i,则在子集之后)。

“fileIWantToAnalyze”是一个 data.table
for(attribute in colnames(fileIWantToAnalyze)[c(1,3,5,7,9,11,13,15,17)]){
  fileIWantToAnalyze[,.(mean1 = mean(get(attribute)),count1 = .N),
                      by = .(GroupingColumn1,sub("a", "b", attribute))]
}

这也行不通

for (attribute in colnames(fileIWantToAnalyze)[c(1,3,5,7,9,11,13,15,17)]){
  fileIWantToAnalyze[,.(mean1 = mean(get(attribute)),count1 = .N),
    by = .(GroupingColumn1,attribute)]
}

以下代码给出了我正在寻找的答案 - 但我想使用循环为许多变量生成输出

fileIWantToAnalyze[,.(mean1 = mean(variable_1a),count1 = .N),
    by = .(GroupingColumn1,variable_1b))]

我认为问题在于我在分组时如何在“by”命令中调用“属性”

【问题讨论】:

  • 告诉我们什么是行不通的,而不是告诉我们目标是什么......好吧,你应该能够理解我们的问题在理解你的问题。 .....更不用说没有minimal reproducible example的事实,这使得这不是一个很有吸引力的问题,可以花任何时间解决。对不起。查看How to Askminimal reproducible exampleedit

标签: r loops for-loop data.table


【解决方案1】:

您的问题在于data.table 函数如何解释变量,尽管这实际上可能是一个意外错误。

请注意以下虚拟示例来说明:

dt <- data.table(A = 1:3, b = 3:5, c = 7:5)
#Works:
for(i in names(dt))
  dt[,lapply(.SD, sum), by = i]
#doesnt work
for(i in names(dt))
  dt[,lapply(.SD, sum), by = .(i)]
#works
for(i in names(dt))
  dt[,lapply(.SD, sum), by = c(i)]

基本上,data.table 似乎不检查.(...) 的每个元素是否是包含在表的命名空间中的单个字符向量。

因此,一个简单的解决方法是在 by 参数中使用字符向量。以下是您的代码的重新访问版本。

for(attribute in colnames(fileIWantToAnalyze)[seq(1, 17, by = 2]){
  fileIWantToAnalyze[,.(mean1 = mean(get(attribute)),count1 = .N),
                      #Note that "by" is now in a character vector.  
                      by = c("GroupingColumn1", sub("a", "b", attribute))]
}

【讨论】:

    【解决方案2】:

    考虑将宽数据重塑为长格式,这通常是大多数分析方法(聚合、绘图、建模)的首选方法。使用这种方法,您可以避免复杂的循环。另外,data.table 有reshaping methods,包括meltdcast

    melt_dt <- melt(fileIWantToAnalyze, 
                    id.vars = c("GroupingColumn1"), 
                    measure.vars = list(paste0("variable_", 1:9, "a"),
                                        paste0("variable_", 1:9, "b"))
                    value.name = c("value_a", "value_b")
                   )
    
    agg_dt <- melt_dt[, .(mean_value=(value_a), count=.N), 
                      by=list(GroupingColumn1, value_b)][order(GroupingColumn1, value_b)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 2020-08-18
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      相关资源
      最近更新 更多