楼主: peter
4607 7

[问答] 请问一个if-else的编程问题 [推广有奖]

  • 4关注
  • 7粉丝

已卖:211份资源

学科带头人

27%

还不是VIP/贵宾

-

威望
0
论坛币
20263 个
通用积分
7.2198
学术水平
13 点
热心指数
13 点
信用等级
13 点
经验
5185 点
帖子
1105
精华
0
在线时间
1853 小时
注册时间
2005-3-10
最后登录
2025-12-7

楼主
peter 发表于 2012-5-14 11:03:01 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

我有一个data frame叫做cpi,有33列,在画直方图的时候,我想让各个条块有不同的颜色,条件是:
在第3到33列里,
当任一列的中位数大于等于第二列的中位数时,其颜色为orange
当任一列的中位数小于第二列的中位数时,其颜色为forestgreen


我在R里面写了如下的代码


for(i in 3:33){
if(
median(cpi[,i])>=median(cpi[,2])
){
yanse="orange"}
else {yanse="forestgreen"}
}


期望结果时,当这些代码运行通过后,我输入yanse,就得到一个形如("forestgreen","forestgreen","orange","orange",..."orange")的结果。


但是,上面代码没有通过,R报出的错误是:
> for(i in 3:33){
+ if(
+ median(cpi[,i])>=median(cpi[,2])
+ ){
+ yanse="orange"}
+ else {yanse="forestgreen"}
+ }
错误于if (median(cpi[, i]) >= median(cpi[, 2])) { :
需要TRUE/FALSE值的地方不可以用缺少值


请高手指点下,要达到我想要的结果,该怎样修改代码?


二维码

扫码加我 拉你入群

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

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

关键词:else ELS LSE Orange median frame median orange 中位数 直方图

沙发
kk22boy 发表于 2012-5-14 22:39:01
试试这样行不行
yanse=numeric(31)
for(i in 3:33){
  if(
    median(cpi[,i])>=median(cpi[,2])
    ){
    yanse[i-2]="orange"}
  else {yanse[i-2]="forestgreen"}
}
已有 4 人评分学术水平 热心指数 信用等级 收起 理由
famousid + 1 + 1 + 1 热心帮助其他会员
peter + 1 + 1 + 1 热心帮助其他会员
epoh + 1 + 1 + 1 热心帮助其他会员
qoiqpwqr + 1 热心帮助其他会员

总评分: 学术水平 + 3  热心指数 + 4  信用等级 + 3   查看全部评分

如果该贴对您有些许帮助,希望你能回复一下或者评一下热心指数!谢谢!

藤椅
peter 发表于 2012-5-15 22:43:11
kk22boy 发表于 2012-5-14 22:39
试试这样行不行
yanse=numeric(31)
for(i in 3:33){
谢谢您的回复!
在前面加yanse=numeric(31)的确是必要的,在条件里面也要出现i。
我想问下,yanse=numeric(31)中的numeric(31)是什么意思,我理解,这应该是定义一个长度为31某个物体,而我要得到的结果是“orange”,“forestgreen”这样的字符串,当我看到yanse=numeric(31)的时候,我的第一反应是,这里的yanse=numeric(31)是不是应该是yanse=String(31),但是我用string(31),运行的结果是:
> yanse=String(31)
错误: 没有"String"这个函数

所以,我的疑问是numeric到底是个什么含义啊?难道它表示定义一个字符串构成的对象(list?),其长度为numeric之后括号内的值?

板凳
kk22boy 发表于 2012-5-15 22:45:23
呵呵,numeric生成的是一个数值向量,管他是什么呢,等会用新的变量替代它就是了
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
famousid + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

如果该贴对您有些许帮助,希望你能回复一下或者评一下热心指数!谢谢!

报纸
peter 发表于 2012-5-15 22:47:17
顺便说下,我上面的例子要顺利运行还需要改正一个错误,

错误于if (median(cpi[, i]) >= median(cpi[, 2])) { :
需要TRUE/FALSE值的地方不可以用缺少值

这个错误的原因在于我的数据中含有缺失值,所以在计算中位数的时候,要用na.rm=TRUE命令把缺失值去掉,完整的命令如下:
yanse=numeric(32)
for(i in 3:33){
  if(
    median(cpi[,i],na.rm=TRUE)>=median(cpi[,2])
    ){
    yanse[i-1]="orange"}
  else {yanse[i-1]="forestgreen"}
}

地板
peter 发表于 2012-5-15 22:57:59
kk22boy 发表于 2012-5-15 22:45
呵呵,numeric生成的是一个数值向量,管他是什么呢,等会用新的变量替代它就是了
哦,明白了,就是反正这个命令就是生成了占它后面参数个地址的东西,然后你往这个地址里放什么是任意的。是吧?

我再追问下,如果我想直接就生成字符串向量该用什么命令?R中有这个命令么?

如果想生成一个矩阵值,是不是用matrix(m,n),表示生成m行,n列的矩阵?

我在此例中把代码修改如下:

yanse=matrix(4,8)
for(i in 3:33){
  if(
    median(cpi[,i],na.rm=TRUE)>=median(cpi[,2])
    ){
    yanse[i-1]="orange"}
  else {yanse[i-1]="forestgreen"}
}

结果出来这么一个奇怪的东西:
> yanse
[1] "4"           "forestgreen" "forestgreen" "orange"      "orange"     
[6] "orange"      "orange"      "orange"      "orange"      "forestgreen"
[11] "forestgreen" "orange"      "forestgreen" "forestgreen" "forestgreen"
[16] "orange"      "orange"      "orange"      "orange"      "forestgreen"
[21] "forestgreen" "forestgreen" "forestgreen" "orange"      "orange"     
[26] "orange"      "forestgreen" "orange"      "orange"      "orange"     
[31] "orange"      "orange"
出来的结果,既不是4行,也不是8列,而且第一个值是4,这是怎么回事?

7
kk22boy 发表于 2012-5-16 08:24:20
peter 发表于 2012-5-15 22:57
哦,明白了,就是反正这个命令就是生成了占它后面参数个地址的东西,然后你往这个地址里放什么是任意的。 ...
不是的,生成m行,n列矩阵
d=matrix(0,nrow=m,ncol=n)
具体还是看下
?matrix
多看帮助,多用help
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
epoh + 1 + 1 + 1 我很赞同
famousid + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

如果该贴对您有些许帮助,希望你能回复一下或者评一下热心指数!谢谢!

8
peter 发表于 2012-5-16 09:40:57
kk22boy 发表于 2012-5-16 08:24
不是的,生成m行,n列矩阵
d=matrix(0,nrow=m,ncol=n)
具体还是看下
谢谢指点!

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

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