全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
4578 7
2012-05-14

我有一个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值的地方不可以用缺少值


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


二维码

扫码加我 拉你入群

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

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

全部回复
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"}
}
二维码

扫码加我 拉你入群

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

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

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之后括号内的值?
二维码

扫码加我 拉你入群

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

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

2012-5-15 22:45:23
呵呵,numeric生成的是一个数值向量,管他是什么呢,等会用新的变量替代它就是了
二维码

扫码加我 拉你入群

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

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

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"}
}
二维码

扫码加我 拉你入群

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

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

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,这是怎么回事?
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群