作者EricTao ()
看板R_Language
标题[问题] 制作表格
时间Mon Feb 2 01:43:56 2015
[问题类型]:
程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
[软体熟悉度]:
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
我有一个data frame,想要做成类似这样的表格
http://ppt.cc/nJZr 图一
而data frame如图中的右半边
http://ppt.cc/wauk
问题1. 如何为这样的表格建立dara frame?
原本想用by或是apply之类搭配自己写函数,用函数判断,什麽型态的栏位要做什麽统计
但是by丢进函数的lists好像还是要用for loop处理。
这样好像乾脆直接写loop 一个个column去统计就好了。(by还是有分组的功能就是了)
还是R中有比较好的方法可以写?
问题2. data中的那些值为1/0的栏位,其实是代表boolean的T/F,在R中好像不能混用?
因为这个data之後会丢去做glm。
请问我该怎麽转换型态? 或者,在写CSV档时怎麽表示boolean值给R来读?
抱歉这次的问题有点乱,想不到怎麽问比较有条理。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.137.56
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1422812638.A.334.html
※ 编辑: EricTao (140.112.137.56), 02/02/2015 01:45:22
1F:→ andrew43: 在R中0/1和F/T是通用的。像是做逻辑式回归,0/1即可。 02/02 01:53
2F:→ andrew43: 我认为你原本的资料是洽当的。要再做各别的描述只要 02/02 01:54
3F:→ andrew43: 按二个组切开分别分析就可以了。 02/02 01:55
4F:→ andrew43: 但如果要一键完成,大概还是要自己写。 02/02 01:56
5F:→ andrew43: 我想到的也是用for loop走每一栏,然後用tapply进行。 02/02 02:06
感谢,请问可以直接写函式来loop,而不用tapply吗? 还是这样比较好写?
※ 编辑: EricTao (140.112.137.56), 02/02/2015 14:12:26
看来 by是传入一个个list而非list(list()),所以只有单层回圈
回传值也是一样,非单一个资料结构?
用rbind串成frame初步完成,只是as.integer还是会显示浮点数@@"
df[names(x[i])]<-as.integer(sum(x[i]==1))
※ 编辑: EricTao (140.112.137.56), 02/02/2015 17:02:35
6F:→ andrew43: 是否请你写出一个雏形,看看你卡在哪里,再来一起解? 02/03 00:16
7F:→ celestialgod: 给partital data 给你写的程式码 再来讨论比较好 02/03 13:14
8F:→ celestialgod: 资料不同 怎样整理比较快也不同 02/03 13:15
抱歉最近在看别的部分,上一次编辑其实是想表达初步解决了的意思。
承蒙如此热情,就再麻烦大大们,看能不能改进了
资料长这样
http://ppt.cc/i77w
目前table长这样
http://ppt.cc/qonZ 有点丑XD 有空再看怎麽调校外观..
--
output$DFcc<-renderTable({
if(length(input$y)<1)return()
d<-by(cova,eval(parse(text=paste("cova$",input$y,sep=""))),
mtab)
#把input$y的值串在cova$上,例如cova$HTN,作为BY的分组栏位。
#用 d<-by(cova,cova[[input$y]],mtab) 好像就可以了?
f<-t(do.call(rbind,d))
#把BY的回传值rbind再转秩成我要的table
})
mtab<-function (x){
df<-list()
df["n"]<-nrow(x)
for(i in 1:length(x))
{
if(names(x[i])=="ID") {}#noop
#这边想要判断栏的变数型态不过还不知道怎麽写好
#字串就跳过但是M/F要处理,不知道能不能用boolean?
#数字如果是1/0视为boolean,但年龄应该要show平均值&range
else if(names(x[i])=="GENDER") {
df["Male"]<-as.character(sum(x[i]=="M"))
df["Female"]<-as.character(sum(x[i]=="F"))
}
......
else {
df[names(x[i])]<-as.character(sum(x[i]==1))
}
}
return(df)
}
※ 编辑: EricTao (140.112.137.56), 02/06/2015 19:06:10
9F:→ andrew43: 用栏名(即变数名)来判断会不会方便一些? 02/07 17:06
10F:→ andrew43: 如果纯靠资料内容来判断,似乎比较困难。 02/07 17:07
11F:→ andrew43: 不过这都视你未来会丢进什麽资料而定。 02/07 17:08
12F:→ EricTao: 对阿 目前是靠栏位名判断 想顺便练习看看就是XD 02/07 22:22
13F:→ andrew43: length(table(x)) 如果等於 2 可以猜测为binary。 02/07 23:14
如果能判断此栏的数值range,对了,像
图一中age的range应该用什麽方法来算呢?
同样的方法能判断1/0的特徵吧?
用max/min好像可以耶? 之前一直脑筋转不过来
※ 编辑: EricTao (140.112.137.56), 02/09/2015 15:56:16