1,.先定义卡方检验的一个方法
(1)读取文件,并根据x,y的参数获取相关的列数
(2)对单选项的处理:直接生成列联表
(3)对多选项的处理:对每个子选项都生成列联表,并将每个列联表的选择人数的那一列的数据取出并进行拼接,生成矩阵A
(4)求出每一行的总和,并生成单列矩阵B
(5)求出每行数据对每行的和的占比,并生成相同维度的矩阵C
(6)将数据统计矩阵A和数据占比矩阵C进行拼接,生成矩阵D
(7)将第四步骤的单例矩阵B和D矩阵拼接,生成E
##卡方检测的函数
#注:函数的参数表示形式诸如"X4","X5"等(X为大写)
#x代表匹配方编号,XIsName匹配方名称
#y代表被匹配方编号,yIsName被匹配方名称
chiSquare<-function(x,y,xIsName,yIsName)
{
#x <- "X1"
#y <- "X11"
da<<-read.csv("C:/Users/admin/Desktop/R/问卷数据(编号).csv") #enconding="utf-8"
#返回data的列名
cnames<-colnames(da)
#开头为y开头
x2 <- paste(x,"\\.", sep = "")
y2 <- paste(y,"\\.", sep = "")
#print(x)
#print(y)
#两个选项的各自所有可能
Xnames<-grep(x2,cnames,value=T)
Ynames<-grep(y2,cnames,value=T)
#print(Xnames)
#print(Ynames)
count<<-0
##两层循环
#da4<<-table(da$X1.您住的城市.,da$X4..高级的.)
for (Xname in Xnames) {
for (Yname in Ynames) {
count<<-count+1
tempda4<-table(da[[Xname]],da[[Yname]])
if((count == 1) && (length(Xnames)*length(Ynames) == 1))
{
da4<<-table(da[[Xname]],da[[Yname]])
}
if((count == 1) && length(Xnames)*length(Ynames) > 1)
{
da4<<-table(da[[Xname]],da[[Yname]])
da4<<-da4[,2:2]
}
if(count>1)
{
da4 <<- cbind(da4,tempda4[,2:2])
}
}
}##for循环结束
#显示检测报告的内容
result<-chisq.test(da4)
pvalue <- result$p.value
if(pvalue < 0.05)
{
print("检测内容:")
print(paste(paste(xIsName, yIsName, sep = "和"),"进行卡方检测",sep=""))
print("检测结果:")
print(result)
print("检测结论:")
print(paste(paste(xIsName, yIsName, sep = "和"),"有显著相关性(p<0.05)",sep=""))
#print("-----分隔符------")
#print(paste(paste(x, y, sep = "和"),"交叉图表的结果",sep=""))
}else{
print("检测内容:")
print(paste(paste(xIsName, yIsName, sep = "和"),"进行卡方检测",sep=""))
print("检测结果:")
print(result)
print("检测结论:")
print(paste(paste(xIsName, yIsName, sep = "和"),"无显著相关性(p>0.05)",sep=""))
#print(paste(paste(x, y, sep = "和"),pvalue,sep="卡方检测结果 p>0.05 不输出,p=="))
}
#定义长度和宽度
width<<-paste(y,1:length(da4[1,]),sep='.')
width<<-c(width,"sum")
height<<-paste(x,1:length(da4[,1]),sep='.')
#求每一列的和
daCoToal<-matrix(rowSums(da4),ncol = 1,byrow = FALSE)#行之和S
#得到相对应的占比矩阵,并和初始数据集合并
daPer<- paste(round(da4[,1:length(da4[1,])]/daCoToal[,1]*100,2),'%',sep='')
newdaPer<-paste(paste("(",daPer,sep=""),")",sep = "")
daPermatrix<-matrix(paste(da4,newdaPer,sep=''),nrow = length(da4[,1]))
#添加一列总和的数据
da4 <<- cbind(daPermatrix,daCoToal[,1:1])
if(length(Xnames)*length(Ynames) == 1 && length(daPermatrix[1,]) <=2)
{
colnames(da4)<-c("no","yes","sum")
rownames(da4)<-c(height)
}
else
{
#根据比对的选项个数生成对应的变量的个数
colnames(da4)<-c(width)
rownames(da4)<-c(height)
}
print(paste(paste(xIsName, yIsName, sep = "和"),"交叉比较的图表",sep=""))
print(da4)
}
2调用程序方法
arr<-c("X1.您住的城市","X2.您的年龄","X3.您的家庭年收入为",
"X4.洋快餐给您的印象","X5.在哪种情况下会选择吃洋快餐","X6.相对于中式快餐,洋快餐有什么特点",
"X7.洋快餐销售中式食物(如饭,粥,豆浆),对您来说重要吗","X8.您一般会购买这些中式食物吗","X9.为什么会购买",
"X10.为什么不会购买","X11.您觉得洋快餐的定价如何","X12.您最喜欢的是哪一个快餐品牌呢",
"X13.这个品牌有什么独特之处呢")
#注:第一参数对应第三参数名称;第二参数对应第四参数名称
chiSquare("X1","X13",arr[1],arr[13])
3.程序的运行截图