请选择 进入手机版 | 继续访问电脑版
楼主: XXXjl
2630 12

[作业] 关于给数据赋值 [推广有奖]

  • 1关注
  • 0粉丝

高中生

67%

还不是VIP/贵宾

-

威望
0
论坛币
108 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1369 点
帖子
18
精华
0
在线时间
42 小时
注册时间
2016-3-25
最后登录
2018-12-26

XXXjl 发表于 2017-11-12 02:34:37 |显示全部楼层 |坛友微信交流群
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
原来数据大概这样的:
[[1]]
   ID class score
1   1     1    44
2   2     1    53
3   3     1    90
.
.
.
[[4]]
     ID class score
204 204     4     0
205 205     4    84
206 206     4    80
207 207     4    61
208 208     4    52
209 209     4    63
210 210     4    49

然后我是想#以60,70,85为界,将成绩分为“优秀”、“中等”、“及格”、“不及格”四类
写了下面这个

for(i in 1:4)
{
classn[]$score[which(classn[]$score<60)]<-"不及格"
classn[
]$score[which(classn[]$score>=60&classn[]$score<70)]<-"及格"
classn[
]$score[which(classn[]$score>=70&classn[]$score<85)]<-"中等"
classn[
]$score[which(classn[]$score>=85)]<-"优秀"
}
classn

但是结果会出错  全部都显示优秀
[[1]]
   ID class score
1   1     1  优秀
2   2     1  优秀
3   3     1  优秀
4   4     1  优秀
5   5     1  优秀
6   6     1  优秀
7   7     1  优秀
8   8     1  优秀
9   9     1  优秀
10 10     1  优秀
11 11     1  优秀
12 12     1  优秀
13 13     1  优秀

一直想不通什么原因
把那些代码稍微改下
classn[
][which(classn[]$score<60),3]<-"不及格"
也还是全部显示优秀

观察结果,有一两个score=100的数据没有赋值"优秀"
于是修改 classn[
][which(classn[]$score>=85&classn[]$score<=100),3]<-"优秀"
结果发现所有score数据都已赋值  但是也还是只有"不及格""优秀"  两项 就是赋值也是乱的


1.尝试删除了赋值优秀那一行代码,结果显示又正常了

2.确定没有输入法错误

求R大神帮下忙,谢谢!

二维码

扫码加我 拉你入群

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

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

关键词:score Which core SCOR SCO

已有 1 人评分经验 收起 理由
kongqingbao280 + 40 精彩帖子

总评分: 经验 + 40   查看全部评分

XXXjl 发表于 2017-11-12 02:49:30 |显示全部楼层 |坛友微信交流群
不知道为什么我这里显示好像出错了

那些代码应该都是  classn[[i]]

使用道具

jiangbeilu 学生认证  发表于 2017-11-12 10:03:27 |显示全部楼层 |坛友微信交流群
  1. score_level <- function(sub_df){
  2.     sub_df$score_level <- "不及格"
  3.     sub_df$score_level[which(sub_df$score>=85)] <- "优秀"
  4.     sub_df$score_level[which(sub_df$score<85 & sub_df$score>=70)] <- "中等"
  5.     sub_df$score_level[which(sub_df$score<70 & sub_df$score>=60)] <- "及格"
  6.     return(sub_df)
  7. }
  8. dd = data.frame(name=c('a','c','d','f'),score=c(55,61,75,89))
  9. score_level(dd)
复制代码


尽量少使用循环,R里面有lapply,sapply这样的函数,可以对列表里的每一个data.frame进行操作的。你试试上面的score_level函数。
sub_df是数据框
sub_df$score_level是新建一列,名叫score_level
代码里可能因为$符号显示问题和下划线问题把sub_df和score_level显示错了,你理解一下就可以了。
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
cheetahfly + 20 + 1 + 1 精彩帖子

总评分: 论坛币 + 20  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

XXXjl 发表于 2017-11-12 18:15:16 |显示全部楼层 |坛友微信交流群
jiangbeilu 发表于 2017-11-12 10:03
尽量少使用循环,R里面有lapply,sapply这样的函数,可以对列表里的每一个data.frame进行操作的。你试试 ...
我试了一下 你的代码是把全年级的"不及格 “及格” "“中等” “优秀”的人数统计起来了
但是我想要的结果是 在数据里显示各学生成绩的level 如下:
[[1]]
   ID class  score
1   1     1 不及格
2   2     1 不及格
3   3     1     90
4   4     1    100
5   5     1     86
6   6     1     89
7   7     1 不及格
8   8     1    100
9   9     1     98
10 10     1     99
11 11     1   中等


PS:
R语言小白一个  由于刚刚学没多久 刚学到程序控制结构  所以就用for循环了
我想知道一个是for循环在这里为什么不行  另一个是遇到这些问题一般应该从哪方面思考出错的地方
再问一下 R语言的包实在太多了 我想请问下在以后的学习中  应该怎么 或者说哪里可以 系统地了解一些安装包以及其作用和用法?谢谢

使用道具

jiangbeilu 学生认证  发表于 2017-11-12 20:15:39 |显示全部楼层 |坛友微信交流群
XXXjl 发表于 2017-11-12 18:15
我试了一下 你的代码是把全年级的"不及格 “及格” "“中等” “优秀”的人数统计起来了
但是我想要的结 ...
截图.png

这个结果不可能统计人数的呃,你再确认一下代码有没有误
Tomorrow is another day!

使用道具

XXXjl 发表于 2017-11-12 21:30:13 |显示全部楼层 |坛友微信交流群
jiangbeilu 发表于 2017-11-12 20:15
这个结果不可能统计人数的呃,你再确认一下代码有没有误
之前搞错了  你这样的确可以 会另外产生一列score_level 在旁边对应每个分数
但是我想替换掉原来的分数的话是把函数里面的   _level  删去吗?
这样的话为什么它还是会只是显示优秀的?

使用道具

XXXjl 发表于 2017-11-12 22:01:34 |显示全部楼层 |坛友微信交流群
上传了一下原始数据和我的程序
希望大家方面的话帮忙看下  谢谢

赋值程序及原始数据.rar

10.29 KB

本附件包括:

  • final exam scores.csv
  • 赋值.docx

使用道具

苏苏mu 发表于 2017-11-13 17:10:57 |显示全部楼层 |坛友微信交流群
来看看大家的回复~~~

使用道具

XXXjl 发表于 2017-11-14 17:10:13 |显示全部楼层 |坛友微信交流群
  1. for(i in 4:1)
  2. {
  3. classn[[i]][which(classn[[i]]$score>=85),3]<-"优秀"
  4. classn[[i]][which(classn[[i]]$score<60),3]<-"不及格"
  5. classn[[i]][which(classn[[i]]$score>=60&classn[[i]]$score<70),3]<-"及格"
  6. classn[[i]][which(classn[[i]]$score>=70&classn[[i]]$score<85),3]<-"中等"
  7. }
复制代码
1.PNG



2.PNG


我把优秀放到上面,结果就正常了
但是把优秀那行代码放到循环里面最后一行 就是中等的下面,结果又全是错的

后来我发现 只要"优秀"那一行代码在"不及格"那一行代码上面 好像结果都正常

想知道这是为什么呢?

使用道具

jiangbeilu 学生认证  发表于 2017-11-14 20:35:43 |显示全部楼层 |坛友微信交流群
XXXjl 发表于 2017-11-14 17:10
我把优秀放到上面,结果就正常了
但是把优秀那行代码放到循环里面最后一行 就是中等的下面,结果 ...
直接对原始变量进行更改本身就是错误的行为。无论你怎么放,只要你替换原变量,此方法就是错误的。
  1. nn <- c(1,2,3,4)
  2. nn[3] <- '优秀'
  3. nn
复制代码
一个数值型的向量,在你给其中任何一个值做了字符替换后,整个向量都会变量字符型向量,而字符型向量比较大小,'9' >'100'也是对的。
所以你觉得结果会正确么?
提示你,还是好好地生成一个新的变量,最后再替换原变量。

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-16 20:12