setDT(dat)出错:创建函数时

时间:2018-02-19 10:52:31

标签: r function dplyr data.table

我正在为以下活动创建功能:

library('data.table')
library(dplyr)
T2 <- dcast(test, Q27 ~ Q12_1_TEXT, fun.aggregate = length)
T3<-T2%>% mutate(Q27=as.character(Q27),"Todo el Mercado"=rowSums(T2[,2:ncol(T2)]))

ALL <- as.list( c( Q27 = "Número_de_Respuestas", colSums(T3[, 2:ncol(T3)]) ) )

T3[, 2:ncol(T3)]<- sapply(T3[, 2:ncol(T3)],prop.table)

T3[, 2:ncol(T3)]<- sapply(T3[, 2:ncol(T3)],function(x) paste0(round(x*100,0), "%"))
Tab <- rbindlist(l = list(T3, ALL)) 
Tab

功能如下:

Single_chile<-function(data,var1,var2){


Tab <- dcast(data, var1 ~ var2, fun.aggregate = length)

Tab1<-Tab%>% mutate(var1=as.character(var1),"Todo el Mercado"=rowSums(Tab[,2:ncol(Tab)]))

ALL <- as.list( c( var1 = "Número_de_Respuestas", colSums(Tab1[, 2:ncol(Tab1)]) ) )

Tab1[, 2:ncol(Tab1)]<- sapply(Tab1[, 2:ncol(Tab1)],prop.table)

Tab1[, 2:ncol(Tab1)]<- sapply(Tab1[, 2:ncol(Tab1)],function(x) paste0(round(x*100,0), "%"))
Tab2 <- rbindlist(l = list(Tab1, ALL)) 

Tab2
}

当我跑步时:

Single_chile(test,"Q27","Q12_1_TEXT")

给出以下错误:

  

setDT(dat)中的错误:参数&#39; x&#39;中的所有元素到了#D;&#39;必须长度相同

我在哪里错了。

dput(test)
structure(list(Q27 = structure(c(2L, 1L, 2L, 2L, 1L, 2L, 2L, 
2L, 2L, 1L), .Label = c("Si", "No"), class = "factor"), Q12_1_TEXT = c("Abertis Autopistas S.a.", 
"Accenture", "Adessa Falabella", "Administradora de Fondos de Cesantía", 
"AES GENER S.A.", "AFP HABITAT S.A.", "Agrícola Ariztía", "Agrosuper S.A.", 
"Aguas de Antofagasta S.A.", "AIG Chile Compañía de Seguros Generales S.A."
)), .Names = c("Q27", "Q12_1_TEXT"), class = c("data.table", 
"data.frame"), row.names = c(NA, -10L))

2 个答案:

答案 0 :(得分:5)

使用debugonce(Single_chile)并尝试再次运行Single_chile(test,"Q27","Q12_1_TEXT")以进入该功能并探索它是如何工作的。

如果您这样做,您会看到错误来自第一行:

dcast(data, var1 ~ var2, fun.aggregate = length)

问题是var1 ~ var2是一个公式,并且您提供了var1var2作为字符串(即,函数看到的是'Q27' ~ 'Q12_1_TEXT',<如您所愿,强>不 Q27 ~ Q12_1_TEXT。您真正想要的是(在您的测试用例中)

dcast(data, Q27 ~ Q12_1_TEXT, fun.aggregate = length)

有几种方法可以做到这一点。最接近你的方法是从字符串构建公式:

f = as.formula(sprintf('%s ~ %s', var1, var2))
dcast(data, f, fun.aggregate = length)

您的功能还有一些问题,但我会留给您探索出错的地方。

答案 1 :(得分:2)

您可以使用get功能解决问题,如下所示。问题是您使用 var1 var2 参数作为字符串,但在函数内部无法正确转换。您可以使用parse with eval(NSE函数)来解决此问题,也可以使用get

Single_chile<-function(data,var1,var2){


  Tab <- dcast(data, get(var1) ~ get(var2), fun.aggregate = length)

  Tab1<-Tab%>% mutate("Todo el Mercado"=rowSums(Tab[,2:ncol(Tab)]))

  ALL <- as.list( c( var1 = "Número_de_Respuestas", colSums(Tab1[, 2:ncol(Tab1)]) ) )

  Tab1[, 2:ncol(Tab1)]<- sapply(Tab1[, 2:ncol(Tab1)],prop.table)

  Tab1[, 2:ncol(Tab1)]<- sapply(Tab1[, 2:ncol(Tab1)],function(x) paste0(round(x*100,0), "%"))
  Tab2 <- rbindlist(l = list(Tab1, ALL)) 

  Tab2
}

Single_chile(test,"Q27","Q12_1_TEXT")

我希望这能解决你的问题。

由于