楼主: dxystata
5215 20

[问答] 通过aaa得到dataframe bbb(4行6列) [推广有奖]

11
playmore 发表于 2014-5-22 15:42:51
dxystata 发表于 2014-5-22 13:49
程序运行有误,函数内部还有group1 和 group2
嗯,粗心了
你照着原样改下就好了

另外,我不知道你为什么要自己做个函数,用现成的不好吗?
如果想要写个更出色的
可以先看下table()函数的源代码,然后在它的基础上进行改进比较好
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

12
playmore 发表于 2014-5-22 15:43:45
yywan0913 发表于 2014-5-22 14:03
多谢,这个设置我都用了,没有效果啊
另外我函数里还加了stringsAsFactors=FALSE,也没用,搞不明白了
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

13
yywan0913 在职认证  发表于 2014-5-22 15:51:26
playmore 发表于 2014-5-22 15:43
多谢,这个设置我都用了,没有效果啊
另外我函数里还加了stringsAsFactors=FALSE,也没用,搞不明白了
放在所有data.frame的前面设置。
之后再aaa=date.frame();   res=data.frame()
是什么给了你自信

14
galilee 在职认证  发表于 2014-5-22 17:24:07
这是题目么?
从数据管理的角度,
gcat    grp1  pct1  grp2  pct2   Total (列名)
  A        2   66.67    1   33.33    3
  B        2   66.67    1   33.33    3
Total     4               2              6
这个最后一行的total是毒药。一个干净的数据表,每一行都应该是一个数据,这里A B 和total的性质完全不一样,直接导致对这个数据表进行处理的时候得不到应该有的值。
如果不用得到最后一行的话,直接用 reshape2库中的 dcast函数直接完成你要的转换。
我的征途是星辰大海。

15
galilee 在职认证  发表于 2014-5-22 17:29:53
直接用 reshape2 库中的 dcast 函数就可以。

另外,
gcat    grp1  pct1  grp2  pct2   Total (列名)
  A        2   66.67    1   33.33    3
  B        2   66.67    1   33.33    3
Total     4               2              6

这个表的最后一行非常没有必要。从一个干净数据库的角度,total这一行破坏了数据表的完整性,使得这个表不能在此使用。 比如你summary 这个新的table,得到的 grp1有8个。
我的征途是星辰大海。

16
dxystata 发表于 2014-5-22 20:52:04
playmore 发表于 2014-5-22 15:42
嗯,粗心了
你照着原样改下就好了
如何看table()函数的源代码?谢谢!

17
dxystata 发表于 2014-5-22 22:36:44
playmore 发表于 2014-5-22 13:24
写成函数形式了
另外还是有factor的问题,有高人看看顺便给解决了吧
我就是觉得R里的factor挺烦人的,也 ...
能否把你的程序修改一下能运行,谢谢!

18
dxystata 发表于 2014-5-22 22:36:47
playmore 发表于 2014-5-22 13:24
写成函数形式了
另外还是有factor的问题,有高人看看顺便给解决了吧
我就是觉得R里的factor挺烦人的,也 ...
能否把你的程序修改一下能运行,谢谢!

19
playmore 发表于 2014-5-23 08:40:58
dxystata 发表于 2014-5-22 22:36
能否把你的程序修改一下能运行,谢谢!
你直接运行下面的代码,然后看bbb是什么
  1. options(stringsAsFactors = FALSE)

  2. tttab <- function(ds,var="group1",group="group2"){
  3.   
  4.   stopifnot(is.data.frame(ds))
  5.   
  6.   res <- data.frame(gcat=unique(ds[,group]),stringsAsFactors=FALSE)
  7.   
  8.   for (i in 1:length(res$gcat)){
  9.     grp <- unique(ds[,var][which(ds[,group]==res$gcat[i])])
  10.    
  11.     for (j in 1:length(grp)){
  12.       res[,paste("grp",j,sep="")] = grp[j]
  13.       res[,paste("pct",j,sep="")] = eval(parse(text=paste("sum(with(ds,",var,"==j & ",group,"==res$gcat[i])) / sum(with(ds,",group,"==res$gcat[i]))",sep="")))
  14.     }
  15.   }
  16.   
  17.   res$Total <- eval(parse(text=paste("sum(with(ds,",group,"==res$gcat[i]))",sep="")))
  18.   
  19.   ttl <- apply(res[,-1],2,sum)
  20.   ttl$gcat <- "Total"
  21.   
  22.   res <- rbind(res,ttl)
  23.   
  24.   return(res)
  25. }
  26.   
  27. aaa <- data.frame(group1=c(1,1,2,2,1,1),group2=c("A","B","A","B","A","B"))

  28. bbb <- tttab(ds=aaa,var="group1",group="group2")
复制代码
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

20
playmore 发表于 2014-5-23 08:46:36
dxystata 发表于 2014-5-22 20:52
如何看table()函数的源代码?谢谢!
在R里直接table回车
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 09:15