楼主: barcasuoai
4387 9

[问答] 请教一下大神,如何选取指定行的前后各2行数据,并组成新的数据框 [推广有奖]

  • 0关注
  • 0粉丝

初中生

80%

还不是VIP/贵宾

-

威望
0
论坛币
15 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
71 点
帖子
9
精华
0
在线时间
26 小时
注册时间
2015-4-6
最后登录
2018-10-30

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
列举出了数据框的前20行数据,希望是把point=1的行和该行前后各两行的数据抓取出来并建立新的数据框
各位大神帮忙看一看
      time  value point
1       0.00 1.0738     0
2       0.01 1.0738     0
3       0.02 1.0661     0
4       0.03 1.0712     0
5       0.04 1.0687     0
6       0.05 1.0738     0
7       0.06 1.0763     0
8       0.07 1.0738    1
9       0.08 1.0738     0
10      0.09 1.0789     0
11      0.10 1.0661     0
12      0.11 1.0712     0
13      0.12 1.0712     0
14      0.13 1.0738     1
15      0.14 1.0687     0
16      0.15 1.0814     0
17      0.16 1.0814     0
18      0.17 1.0738     0
19      0.18 1.0738     0
20      0.19 1.0712     0

二维码

扫码加我 拉你入群

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

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

关键词:数据框 Point value 数据抓取 alue

沙发
barcasuoai 发表于 2018-1-18 23:09:11 |只看作者 |坛友微信交流群
有哪位高手帮忙解答一下不

使用道具

藤椅
swufeyumeng 在职认证  发表于 2018-1-19 01:59:06 |只看作者 |坛友微信交流群
df<-read.csv('data.csv',sep=',',header=T)    #读取数据
n1<-which(df$point==1)    #获取point为1的行号
n2<-c(n1-2,n1-1,n1,n1+1,n1+2)    #组合前后两行的行号
n2<-sort(n2)    #按行号大小重新排序
df1<-df[n2,]    #提取新的数据集

如果有point为1的行位于原数据集的前两行和后两行,则会出现行号溢出,这种情况可以手工处理一下。
如果两个point为1的行距离小于4行,会出现重复数据,可以再进行一步去重操作。

> df1
   time  value point
6  0.05 1.0738     0
7  0.06 1.0763     0
8  0.07 1.0738     1
9  0.08 1.0738     0
10 0.09 1.0789     0
12 0.11 1.0712     0
13 0.12 1.0712     0
14 0.13 1.0738     1
15 0.14 1.0687     0
16 0.15 1.0814     0



已有 4 人评分经验 学术水平 热心指数 信用等级 收起 理由
falseform + 1 + 1 + 1 精彩帖子
xing035400 + 1 精彩帖子
yywan0913 + 1 + 1 加上 n2 = unique(n2[n2&gt;0&amp;n2&lt;=nro
cheetahfly + 20 + 1 热心帮助其他会员

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

使用道具

板凳
xing035400 在职认证  发表于 2018-1-19 11:24:56 |只看作者 |坛友微信交流群
swufeyumeng 发表于 2018-1-19 01:59
df
学习学习

使用道具

报纸
barcasuoai 发表于 2018-1-21 15:55:43 |只看作者 |坛友微信交流群
swufeyumeng 发表于 2018-1-19 01:59
df
感谢解答!!!

使用道具

地板
barcasuoai 发表于 2018-4-8 17:33:09 |只看作者 |坛友微信交流群
swufeyumeng 发表于 2018-1-19 01:59
df
您好,麻烦再请教一下,如果是需要前后各500行数据的话,程序应该如何调整(数据量比较大,其中1的数量非常少,可以忽略溢出的情况)

使用道具

7
swufeyumeng 在职认证  发表于 2018-4-9 12:10:41 |只看作者 |坛友微信交流群
barcasuoai 发表于 2018-4-8 17:33
您好,麻烦再请教一下,如果是需要前后各500行数据的话,程序应该如何调整(数据量比较大,其中1的数量非 ...
程序的思路就是先获取point为1的行号,然后得到前后两行的行号,关键是这一句
n2<-c(n1-2,n1-1,n1,n1+1,n1+2)
n2是一个从n1-2到n1+2的等差数列,当然也可以写成
n2<-c((n1-2):(n1+2))
同理要获取n1前后500行的行号,就可以写成
n2<-c((n1-500):(n1+500))
因为范围扩大到了前后500行,出现头尾溢出、记录项重复的几率也变大了,可以使用unique()函数加一步去重操作。

使用道具

8
barcasuoai 发表于 2018-4-9 12:31:47 |只看作者 |坛友微信交流群
swufeyumeng 发表于 2018-4-9 12:10
程序的思路就是先获取point为1的行号,然后得到前后两行的行号,关键是这一句
n2
感谢这么详细的解答:
我按照n3<-c((n1-500):(n1+500))运行了下,一直会有警告
Warning messages:
1: In (n1 - 500):(n1 + 500) :
  numerical expression has 14 elements: only the first used
本来是有14个piont=1的点,现在只显示第1个前后各500的值了,请教这个问题如何解决

使用道具

9
swufeyumeng 在职认证  发表于 2018-4-9 15:35:31 |只看作者 |坛友微信交流群
barcasuoai 发表于 2018-4-9 12:31
感谢这么详细的解答:
我按照n3
我试了一下,确实会出现这个问题,问题出在n2<-c((n1-500):(n1+500))这个语句。你筛选出来14个符合point=1的行号,这个语句是不能自动组合它们前后500行的行号的。改成这样就好了:
df<-read.csv('data.csv',sep=',',header=T)    #读取数据
n1<-which(df$point==1)    #获取point为1的行号
n2<-c()
for (i in n1) {
  n2<-c(n2,(i-500):(i+500))
}
n2<-sort(n2)    #按行号大小重新排序
df1<-df[n2,]    #提取新的数据集

使用道具

10
barcasuoai 发表于 2018-4-9 16:47:06 |只看作者 |坛友微信交流群
swufeyumeng 发表于 2018-4-9 15:35
我试了一下,确实会出现这个问题,问题出在n2
这回顺利解决咯,多谢多谢

使用道具

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

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

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

GMT+8, 2024-4-20 04:43