楼主: panxinfeng
5680 20

[问答] R,想说爱你不容易 [推广有奖]

  • 0关注
  • 1粉丝

已卖:128份资源

博士生

12%

还不是VIP/贵宾

-

威望
0
论坛币
42 个
通用积分
8.1398
学术水平
6 点
热心指数
11 点
信用等级
7 点
经验
2436 点
帖子
181
精华
0
在线时间
156 小时
注册时间
2008-8-14
最后登录
2024-2-13

楼主
panxinfeng 发表于 2014-5-28 22:51:35 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
决心自学R,过程中磕磕碰碰,遇到难题查阅资料、教材、help()等等等等,耗费大把大把时间,解决了,兴奋的不得了,很有成就感,恨不得向周围的朋友同事炫耀一番。可是,遇到难题就悲催了,明明在sas、spss里面很简单的事情,在R里面却找不到对应的解决方法,比如
1. 求向量中各值的构成比,sas中就是freq,spss里就是“频率”,R中花费九牛二虎之力就是找不到简单的对应函数,在人大论坛发帖子也没得到合适的答案,好心的朋友提供了方案"table(x)/length(x)",可以解决问题,但总感觉不舒服,这么常用的函数(如同mean一样)真的没有对应函数吗?
2. 分组统计,sas中就是by,spss里就是“分组”,R中的方法前天夜里一直熬夜到凌晨两点半,花费了7个多小时,终于找到了,可以用by,可以用tapply,甚至通过设置cbind向量后可以生成sas、spss都无法做到的按自己要求排列的矩阵,直接复制到word表格就ok了,当时感觉R好强大。
3. 今天晚上又花费了一晚上时间,先是寻找R中工作空间的数据库如何保存,以便下次使用。找到了,但是其他统计软件是不能够直接读的,要转换成csv、txt等通用格式,而且write函数的csv默认导入还不行,要设置“,”、设置不读行标题(否则列标题错行),现在是学习过程无所谓,真担心用在实际工作中一不小心导错(标题和数据错行),麻烦就大了。
4. 今天晚上现在遇到的问题让我有了上述小牢骚,问题就是if函数的使用,我其实就是想生成一个新变量a,里面的值要符合如下条件(x=1&y=1&z=1,x、y、z都是长度4009的向量),那么a=1,否则a=0。找了一晚上总是提示错误。最后还是用sas(if x=1 & y=1 & z=1 then a=1; else a=0)一分钟搞定,话说spss我居然没找到方法(这么简单个逻辑居然没找到方法,不会spss不能通过对话框形式完成,非要也用语法吧?苦笑啊)。

R很好,我也很喜欢,我也会继续努力学习。可是就是——“想说爱你不容易!”入门好难!一些基础的需求都很难掌握(我是指我自己,或许我太愚钝了)

最后的最后,发了这么多牢骚,其实还是想针对上述问题请教各位高手朋友,还望不吝赐教:
1. R中是否有独立单一的生成百分构成比的函数,不是指table(),这个只能统计频数;
2. R有自己独立的数据库格式吗?还是只能保存在.R数据空间中,如果需要导入其他软件就要写入到csv、txt等文件中(不谈mysql等数据库链接啥的,太高大上了)?
3. 想生成一个新变量a,里面的值要符合如下条件(x=1&y=1&z=1,x、y、z都是长度4009的向量),那么a=1,否则a=0。语句真么写,尽量不要是自己编函数吧,感觉这样有点儿杀鸡用牛刀的味道,所以今天我也没思考用编函数的方法解决这个问题?


上述问题,还望高手指点,在此多谢了!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:word表格 length Table apply write word表格 数据库 成就感 朋友 空间

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
complicated + 36 + 36 + 3 + 3 + 3 鼓励积极发帖讨论
jmpamao + 60 补偿

总评分: 经验 + 96  论坛币 + 36  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

沙发
playmore 发表于 2014-5-29 10:57:00
1. R里的table就是SAS里的Proc freq,只是函数或过程命名的问题,本质没有不同,你要是写VBA就会发现MS那一套函数命名更是操蛋;
2. R里用plyr包可以用来解决SAS里by的问题,用熟了和SAS里的by一样方便;
3. R和其他软件的数据传递,加个数据库中转吧,mysql就不错,和R一样都是免费的,少量的话只能用csv了;
4. 想要根据多个条件生成一个新变量,如a>100时b=1,50<a<=100时b=0...,在SAS里的data步来几个if else就完了,在R里如果是一个数据框,好像只是ifelse嵌套来实现,条件多的话那代码没法看,写完过两天再看的话基本不明白自己在写什么了,没有SAS代码那么直观。可能也有其他解决方法,但是我还没找到。

看你的贴子,应该SAS和SPSS用的都很熟。我和你差不多,这两个也都用过,也刚刚学习R。我觉得你所产生的不适症状完全是对之前两个工具中毒太深所致。一门新的语言有新的语法,但基本也不外乎主谓宾几个结构,换换位置和排列顺序两已。

另外再有个不适应的是数据结构方面的转换,SAS和SPSS都是基于表的,向量和矩阵之类的用的少,而R、Matlab、Python和其他几乎所有的数值计算工具都是基于向量和矩阵的。R高手们都说要把运算向量化,用SAS的肯定没听说过这说法。所以SAS和数据库联系紧密,以及从Matlab转到R不会有多大障碍。
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
complicated + 12 + 12 + 3 + 3 + 3 热心帮助其他会员
求证1加1 + 1 热心帮助其他会员

总评分: 经验 + 12  论坛币 + 12  学术水平 + 3  热心指数 + 4  信用等级 + 3   查看全部评分

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

藤椅
panxinfeng 发表于 2014-5-29 11:33:17
playmore 发表于 2014-5-29 10:57
1. R里的table就是SAS里的Proc freq,只是函数或过程命名的问题,本质没有不同,你要是写VBA就会发现MS那一 ...
谢谢playmore的详细解释!非常感谢!一起努力学好R吧,凭直觉R真正掌握后会发挥巨大威力的!

板凳
jmpamao 发表于 2014-5-29 13:25:12
对于 PYTHON  我现在也想说    想说爱你不容易

报纸
asprine 发表于 2014-5-29 21:47:09
1. R中是否有独立单一的生成百分构成比的函数,不是指table(),这个只能统计频数;
x/sum(x) ?

2. R有自己独立的数据库格式吗?还是只能保存在.R数据空间中,如果需要导入其他软件就要写入到csv、txt等文件中(不谈mysql等数据库链接啥的,太高大上了)?
R有点像胶水工具吧,几乎所有格式都能通过安装包来实现。mysql连接也倒腾过,还比较容易实现。

3. 想生成一个新变量a,里面的值要符合如下条件(x=1&y=1&z=1,x、y、z都是长度4009的向量),那么a=1,否则a=0。语句真么写,尽量不要是自己编函数吧,感觉这样有点儿杀鸡用牛刀的味道,所以今天我也没思考用编函数的方法解决这个问题?
==
x,y,z是已知向量吗?
a<-as.numeric(x==1&y==1&z==1) ?

地板
panxinfeng 发表于 2014-5-29 23:38:03
asprine 发表于 2014-5-29 21:47
1. R中是否有独立单一的生成百分构成比的函数,不是指table(),这个只能统计频数;
x/sum(x) ?
谢谢你的回复!
1. 经测试是对向量里面每一个值求相对于总和的百分比,不是我说的那个频率百分比的意思
3. 不是我想表达的意思,不过我找到一个用which()函数解决的方法,如下
a = rep(0,4009) #生成一个有长度为4009的向量
a[which(s$n2h==1&s$n3h==1&s$n4h==1)]=1
a就是最后想要的结果了。就是不知道还有没有其他更简洁的做法。

不管怎么说,都非常谢谢你的热心回复!谢谢!

7
perl-fe 发表于 2014-5-30 06:55:38
作为一个程序员; R 更友好些;
SAS也不错, 但是 如果免费就好了额。

8
asprine 发表于 2014-5-30 08:05:23
panxinfeng 发表于 2014-5-29 23:38
谢谢你的回复!
1. 经测试是对向量里面每一个值求相对于总和的百分比,不是我说的那个频率百分比的意思
...
1. 明白了,我再试试。
3. 感觉Which可以省略。用true/false表达式转为数值型也可以:a<-((x==1)&(y==1)&(z==1))*1,这样应该也行,比较简洁。
  1. > x<-as.numeric(rnorm(4009)>0.5)
  2. > y<-as.numeric(rnorm(4009)>0.5)
  3. > z<-as.numeric(rnorm(4009)>0.5)
  4. > a1<-rep(0,4009)
  5. > a1[x==1&y==1&z==1]=1
  6. > a2<-as.numeric((x==1)&(y==1)&(z==1))
  7. > identical(a1,a2)
  8. [1] TRUE
复制代码


9
panxinfeng 发表于 2014-5-30 09:14:03
asprine 发表于 2014-5-30 08:05
1. 明白了,我再试试。
3. 感觉Which可以省略。用true/false表达式转为数值型也可以:a
试过了,你的方法可行!真是越讨论越清晰啊!多谢啦!~

10
asprine 发表于 2014-5-30 11:30:14
panxinfeng 发表于 2014-5-30 09:14
试过了,你的方法可行!真是越讨论越清晰啊!多谢啦!~
不用客气啊,我也是在学习中,这个问题也有可能遇到。我找了下,好像没有直接显示成分频率(百分比式)。
最多只能这样,可以应用于多维表。和table(a)/length(a)一样效果:
  1. prob.table(table(a))
复制代码

如果有gmodels,用CrossTable也可以。
  1. library(gmodels)
  2. CrossTable(a)$prop.tbl
复制代码
不知道有没有更好的。

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

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