楼主: mercuro
4743 11

[问答] 50论坛币求助:R语言选择语句的使用? [推广有奖]

  • 3关注
  • 0粉丝

已卖:95份资源

硕士生

62%

还不是VIP/贵宾

-

威望
0
论坛币
740 个
通用积分
2.4644
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
4694 点
帖子
53
精华
0
在线时间
301 小时
注册时间
2014-5-10
最后登录
2024-3-22

楼主
mercuro 学生认证  发表于 2014-9-14 10:13:12 |AI写论文
50论坛币
a1<-data.frame(a=1:20,b=c(0,3,9,2,3,4,5,1,3,5,7,8,5,3,2,1,3,5,7,8))
a2<-subset(a1,a1[2]>4)

a3<-data.frame(a=1,b=1)
for(i in 1:9){
   a4<-a2[i,]
   print(0)
   if(a2[i,1]==i){
         a3<-rbind(a3,a4)
          print(1)}
   if(a2[i,1]>i){
         b<-a2[i,1]-i
         print(2)
         for(j in 1:b){
              a4[2]<-0
              a4[1]<-i
              print("e")
              a3<-rbind(a3,a4)}}
   }
以上是运行语句,我想用a2生成a3  还原a1(补充值赋值为0),求教,为什么if语句判断失效,直接顺序运行了?按行合并数据,为什么a3  的行变量名会出现奇怪的数字呀?

最佳答案

daishen 查看完整内容

混50论坛币下点资料。 library(data.table) a1 = data.table(a=1:20,b=c(0,3,9,2,3,4,5,1,3,5,7,8,5,3,2,1,3,5,7,8)) setkey(a1,a) a2 = a1 a3 = a2[a1][,list(a,b)] a3 a3 a b 1: 1 0 2: 2 0 3: 3 9 4: 4 0 5: 5 0 6: 6 0 7: 7 5 8: 8 0 9: 9 0 10: 10 5 11: 11 7 12: 12 8 13: 13 5 14: 14 0 15: 15 0 16: 16 0 17: 17 0 18: 18 5 19: 19 7 20: 20 8
关键词:50论坛币 选择语句 0论坛币 R语言 论坛币

沙发
daishen 发表于 2014-9-14 10:13:13
混50论坛币下点资料。

library(data.table)
a1 = data.table(a=1:20,b=c(0,3,9,2,3,4,5,1,3,5,7,8,5,3,2,1,3,5,7,8))
setkey(a1,a)
a2 =  a1[b > 4]
a3 = a2[a1][,list(a,b)]
a3[is.na(b),b:= 0]
a3
     a b
1:  1 0
2:  2 0
3:  3 9
4:  4 0
5:  5 0
6:  6 0
7:  7 5
8:  8 0
9:  9 0
10: 10 5
11: 11 7
12: 12 8
13: 13 5
14: 14 0
15: 15 0
16: 16 0
17: 17 0
18: 18 5
19: 19 7
20: 20 8
已有 2 人评分经验 论坛币 收起 理由
dxystata + 20 + 20 热心帮助其他会员
admin_kefu + 50 热心帮助其他会员

总评分: 经验 + 20  论坛币 + 70   查看全部评分

藤椅
mercuro 学生认证  发表于 2014-9-14 10:15:18
[1] 0
[1] 2
[1] "e"
[1] "e"
[1] 0
[1] 2
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] 0
[1] 2
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] 0
[1] 2
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] 0
[1] 2
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] 0
[1] 2
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] 0
[1] 2
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] 0
[1] 2
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] 0
[1] 2
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"
[1] "e"

运行过程生成的 print,循环运行了9次,if没起到作用!?

板凳
ofzhengyi 发表于 2014-9-14 10:42:04
代码太长,没有注释,所以没看完。但开头的a2<-subset(a1,a1[2]>4)是不是有问题,里面应该是a1[,2]吧?少了个逗号?

报纸
mercuro 学生认证  发表于 2014-9-14 11:14:13
ofzhengyi 发表于 2014-9-14 10:42
代码太长,没有注释,所以没看完。但开头的a24)是不是有问题,里面应该是a1[,2]吧?少了个逗号?
不好意思  第一次发,所有不知道怎么问!


a1<-data.frame(a=1:20,b=c(0,3,9,2,3,4,5,1,3,5,7,8,5,3,2,1,3,5,7,8))#建立数据框a1 含有 a  b#
a2<-subset(a1,a1[,2]>4)        #取出a1中b大于4的数据存为a2#

a3<-data.frame(a=1,b=1)      #建立a3#
for(i in 1:9){               # str(a2)有9个数据,循环9次#
   a4<-a2[i,]                #中间变量a4,只有一行#
   print(0)
   if(a2[i,1]==i){             #判断 a2中a的第i行与i的是否相等,为真 吧a4与a3合并#
         a3<-rbind(a3,a4)
          print(1)}              #打印1#
   if(a2[i,1]>i){                #判断若a2的 i行a 是否大于 i,若大于为真,建立新循环,循环a2 a的第i行与 j差值的次数#
         b<-a2[i,1]-i
         print(2)
         for(j in 1:b){
              a4[2]<-0
              a4[1]<-i
              print("e")
              a3<-rbind(a3,a4)}}   #循环合并到a3#
   }


地板
mercuro 学生认证  发表于 2014-9-14 11:17:34
ofzhengyi 发表于 2014-9-14 10:42
代码太长,没有注释,所以没看完。但开头的a24)是不是有问题,里面应该是a1[,2]吧?少了个逗号?
我就想吧  a3  变成
   
a3  
   a   b
1  1   0
2  2   0
3  3   9
4  4   0
5  5   0
6  6   0
7  7   5
8  8   0
9  9   0
10 10  5
11 11  7
12 12  8
13 13  5
18 18  5
19 19  7
20 20  8

7
mercuro 学生认证  发表于 2014-9-14 16:23:39
daishen 发表于 2014-9-14 10:13
混50论坛币下点资料。

library(data.table)
谢谢 已经解决了 能问下 :=  是连续赋值的意思么?  还有我在问题里贴的 if 语句 是哪里出了问题啊?

8
daishen 发表于 2014-9-14 17:05:04
mercuro 发表于 2014-9-14 16:23
谢谢 已经解决了 能问下 :=  是连续赋值的意思么?  还有我在问题里贴的 if 语句 是哪里出了问题啊?
:=是更新的意思,就是前面已经赋过值了,然后用后面的值取代前面的值。
看你的代码就知道你对R的掌握还是处于原始阶段,没有掌握向量化思维,所以用了那么多for,if,我没有看你的代码,只是看你要表达的意思,用向量化来处理(因为我看到for,if 眼睛就发晕),非常简单。给你一个建议,如果真要处理数据,还是多研究研究data.table 这个包,你会终身受用。

9
mercuro 学生认证  发表于 2014-9-14 21:42:01
daishen 发表于 2014-9-14 17:05
:=是更新的意思,就是前面已经赋过值了,然后用后面的值取代前面的值。
看你的代码就知道你对R的掌握还 ...
万分感谢~~~!!!~~~~

10
jiangbeilu 学生认证  发表于 2014-9-16 23:57:01
如果你的目的是把小于等于4的数变成0,那么只需要这一句就可以了:
a1$b[a1$b<=4]<-0

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

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