楼主: dxystata
5194 20

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

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-2

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

楼主
dxystata 发表于 2014-5-21 04:42:19 |AI写论文
200论坛币
  1. aaa<- data.frame(group1=c(1,1,2,2,1,1),
  2.                  group2=c("A","B","A","B","A","B"))
复制代码

写一个函数通过aaa得到dataframe bbb(4行6列):
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


注:要求采用sum(with(aaa, group1==1 & group2=="A")) 实现。
    不能采用R中已有产生四格表的函数。

最佳答案

playmore 查看完整内容

嗯,我这里看到的贴在网页上的代码有问题 有些$显示不正常,应该是论坛的问题 我这回贴附件里了,你再试试吧
关键词:Dataframe Frame Data Fram FRA

本帖被以下文库推荐

沙发
playmore 发表于 2014-5-21 04:42:20
dxystata 发表于 2014-5-23 09:35
你能运行成功吗?我这里运行报错!能否把code复制到txt中,发到我的邮箱,邮箱pm你。谢谢!
嗯,我这里看到的贴在网页上的代码有问题
有些$显示不正常,应该是论坛的问题
我这回贴附件里了,你再试试吧



test.txt (889 Bytes)
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

藤椅
dxystata 发表于 2014-5-21 23:11:07
继续悬赏!

板凳
路浩张琦 发表于 2014-5-22 00:38:51
太高级了,没看懂,完全不知道那个4行6列是神马样子……

报纸
playmore 发表于 2014-5-22 10:05:13
  1. aaa<- data.frame(group1=c(1,1,2,2,1,1),group2=c("A","B","A","B","A","B"))

  2. res <- data.frame(gcat=unique(aaa$group2),stringsAsFactors=FALSE)

  3. for (i in 1:length(res$gcat)){
  4.   grp <- unique(aaa$group1[which(aaa$group2==res$gcat)])
  5.   
  6.   for (j in 1:length(grp)){
  7.     res[,paste("grp",j,sep="")] = grp[j]
  8.     res[,paste("pct",j,sep="")] = sum(with(aaa, group1==j & group2==res$gcat)) / sum(with(aaa, group2==res$gcat))
  9.   }
  10. }

  11. res$Total <- sum(with(aaa, group2==res$gcat))

  12. ttl <- apply(res[,-1],2,sum)
  13. ttl$gcat <- "Total"

  14. res <- rbind(res,ttl)
复制代码


基本上算是完成了任务,只不过左下角那个Total实在是搞不定

不知道怎么让R取消认定gcat是factor,之前加了stringsAsFactors也没用
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

地板
dxystata 发表于 2014-5-22 11:23:54
playmore 发表于 2014-5-22 10:05
aaa
谢谢!希望调用这样的函数tttab(ds=aaa,var="group1",group="group2")实现。

7
dxystata 发表于 2014-5-22 11:25:33
playmore 发表于 2014-5-22 10:05
aaa
建议代码用
  1.      
复制代码
,显示出来好看一点,谢谢!

8
playmore 发表于 2014-5-22 13:24:48
dxystata 发表于 2014-5-22 11:25
建议代码用,显示出来好看一点,谢谢!
写成函数形式了
另外还是有factor的问题,有高人看看顺便给解决了吧
我就是觉得R里的factor挺烦人的,也看不出来有什么好处
  1. tttab <- function(ds,var="group1",group="group2"){
  2.   
  3.   stopifnot(is.data.frame(ds))
  4.   
  5.   res <- data.frame(gcat=unique(ds[,group]),stringsAsFactors=FALSE)
  6.   
  7.   for (i in 1:length(res$gcat)){
  8.     grp <- unique(ds[,var][which(ds[,group]==res$gcat[i])])
  9.    
  10.     for (j in 1:length(grp)){
  11.       res[,paste("grp",j,sep="")] = grp[j]
  12.       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="")))
  13.     }
  14.   }
  15.   
  16.   res$Total <- sum(with(ds, group2==res$gcat[i]))
  17.   
  18.   ttl <- apply(res[,-1],2,sum)
  19.   ttl$gcat <- "Total"
  20.   
  21.   res <- rbind(res,ttl)
  22.   
  23.   return(res)
  24. }
  25.   
  26. aaa <- data.frame(group1=c(1,1,2,2,1,1),group2=c("A","B","A","B","A","B"))

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

9
dxystata 发表于 2014-5-22 13:49:17
playmore 发表于 2014-5-22 13:24
写成函数形式了
另外还是有factor的问题,有高人看看顺便给解决了吧
我就是觉得R里的factor挺烦人的,也 ...
程序运行有误,函数内部还有group1 和 group2

10
yywan0913 在职认证  发表于 2014-5-22 14:03:14
playmore 发表于 2014-5-22 13:24
写成函数形式了
另外还是有factor的问题,有高人看看顺便给解决了吧
我就是觉得R里的factor挺烦人的,也 ...
  1. options(stringsAsFactors = FALSE)
复制代码
是什么给了你自信

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

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