San*_*yal 1 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
Run Code Online (Sandbox Code Playgroud)
功能如下:
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
}
Run Code Online (Sandbox Code Playgroud)
我跑的时候:
Single_chile(test,"Q27","Q12_1_TEXT")
Run Code Online (Sandbox Code Playgroud)
给出以下错误:
setDT(dat)中的错误:参数"x"到"setDT"中的所有元素必须具有相同的长度
我在哪里错了.
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))
Run Code Online (Sandbox Code Playgroud)
使用debugonce(Single_chile)并Single_chile(test,"Q27","Q12_1_TEXT")再次尝试运行以进入函数并探索它是如何工作的.
如果你这样做,你会看到错误来自第一行:
dcast(data, var1 ~ var2, fun.aggregate = length)
Run Code Online (Sandbox Code Playgroud)
问题是var1 ~ var2一个公式,你提供var1和var2作为字符串(即,函数看到的是'Q27' ~ 'Q12_1_TEXT',而不是 Q27 ~ Q12_1_TEXT你想要的).你真正想要的(在你的测试案例中)是
dcast(data, Q27 ~ Q12_1_TEXT, fun.aggregate = length)
Run Code Online (Sandbox Code Playgroud)
有几种方法可以做到这一点.最接近你的方法是从字符串构建公式:
f = as.formula(sprintf('%s ~ %s', var1, var2))
dcast(data, f, fun.aggregate = length)
Run Code Online (Sandbox Code Playgroud)
您的功能还有一些问题,但我会留给您探讨出了什么问题.