楼主: 小洋仔
1682 9

[问答] 大神们,请帮我解决数据框的小问题 [推广有奖]

  • 2关注
  • 0粉丝

大专生

95%

还不是VIP/贵宾

-

威望
0
论坛币
30 个
通用积分
1.0600
学术水平
5 点
热心指数
9 点
信用等级
5 点
经验
409 点
帖子
51
精华
0
在线时间
49 小时
注册时间
2013-10-11
最后登录
2016-3-20

楼主
小洋仔 学生认证  发表于 2013-12-7 19:59:14 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
下面是代码,数据框data3中包含了数据框data的十行数据,我想把数据框data3中和数据框data一样的十行数据删除掉,要怎么做?
x<-c(0,40)
y<-c(0,40)
par(bg="gray")
plot(x,y,type="n",xlab="",ylab="")
for(x in 0:40){for(y in 0:40)
rect(x-.5,y-.5,x+.5,y+.5)}
points(c(15,24),c(18,20),pch=21,bg="yellow")
x[1]=15
y[1]=18
x2=24
y2=20
m=max(abs(y2-y[1]),abs(x2-x[1]))
n=m+1
addy=(y2-y[1])/m
addx=(x2-x[1])/m
i=2
for(i in 2:n){x[i]=x[1]+(i-1)*addx
y[i]=y[1]+(i-1)*addy
y[i]=round(y[i])}
data<-data.frame(y=y,x=x)
data2=data.frame(x=NULL,Y=NULL)
for(i in 1:10){x<-rep(c((data[i,]$x-1):(data[i,]$x+1)),3)
y<-rep(c((data[i,]$y-1):(data[i,]$y+1)),each=3)
data1<-data.frame(y=y,x=x)
for(j in 1:9){if (sqrt((data1[j,]$x-data[i,]$x)^2+(data1[j,]$y-data[i,]$y)^2)<=1)
{rect(data1[j,]$x-.5,data1[j,]$y-.5,data1[j,]$x+.5,data1[j,]$y+.5,col="green")
data2=data.frame(rbind(data2,data1[j,]))
}}}
data3=unique(data2)
data3
    y  x
2  17 15
4  18 14
5  18 15
6  18 16
8  19 15
21 17 16
61 18 17
81 19 16
22 17 17
62 18 18
82 19 17
53 19 18
63 19 19
83 20 18
24 18 19
64 19 20
84 20 19
25 18 20
65 19 21
85 20 20
26 18 21
66 19 22
86 20 21
57 20 22
67 20 23
87 21 22
28 19 23
68 20 24
88 21 23
29 19 24
69 20 25
89 21 24
data
    y  x
1  18 15
2  18 16
3  18 17
4  19 18
5  19 19
6  19 20
7  19 21
8  20 22
9  20 23
10 20 24

二维码

扫码加我 拉你入群

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

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

关键词:数据框 小问题 Data 怎么做

回帖推荐

ntsean 发表于8楼  查看完整内容

这个用sql的except很容易

熊小贤 发表于7楼  查看完整内容

啊 原来错的离谱了 在两位的基础上又改了下 aa = sapply(1:nrow(data3), function(i){ a = sapply(1:nrow(data), function(j){ return(all(data3==data[j,])) }) }) ab=apply(aa,2,function(x)ifelse(sum(x)>0,T,F)) ac = data3[!ab,] 这样感觉也可以

jmpamao 发表于5楼  查看完整内容

这个是有问题的,return返回的值是 循环第一次的值。 ##apply 后面插 for 循环的。其实真的是绕。 。。。。想修改 改的头大 直接apply apply

熊小贤 发表于3楼  查看完整内容

a = apply(data3, 1, function(x){ for(i in 1:nrow(data)){ return(all(x!=data)) } }) data3[a,]
已有 1 人评分热心指数 收起 理由
qoiqpwqr + 1 鼓励积极发帖讨论

总评分: 热心指数 + 1   查看全部评分

沙发
小洋仔 学生认证  发表于 2013-12-7 20:47:34
我用了这个,感觉就还差一点就可以了。即把10组提出来,这只是最后一组被删除的代码。
for(i in 1:dim(data)[1]){
  for(j in 1:dim(data3)[1]){
    if(data3[j,1]==data[i,1]&data3[j,2]==data[i,2])
       data4=data3[-j, ]
  }
}

藤椅
熊小贤 发表于 2013-12-7 21:44:12
a = apply(data3, 1, function(x){
  for(i in 1:nrow(data)){
    return(all(x!=data[i,]))
  }
})
data3[a,]
已有 1 人评分学术水平 热心指数 收起 理由
qoiqpwqr + 1 + 1 热心帮助其他会员

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

板凳
小洋仔 学生认证  发表于 2013-12-7 22:20:57
熊小贤 发表于 2013-12-7 21:44
a = apply(data3, 1, function(x){
  for(i in 1:nrow(data)){
    return(all(x!=data))
非常感谢。

报纸
jmpamao 发表于 2013-12-7 23:58:55
熊小贤 发表于 2013-12-7 21:44
a = apply(data3, 1, function(x){
  for(i in 1:nrow(data)){
    return(all(x!=data))
这个是有问题的,return返回的值是 循环第一次的值。
##apply 后面插 for 循环的。其实真的是绕。

。。。。想修改 改的头大

直接apply apply
  1. data3<-data.frame(var1=c(1,2,3,4,2,10,1),var2=c(2,2,3,1,1,10,2))
  2. data <-data.frame(var1=c(1,2,4),var2=c(1,2,1))
  3. aa=apply(data3,1,function(x){
  4.                    apply(data,1,function(i)all(x==i))                                   
  5.                  })
  6.                  ab=apply(aa,2,function(x)ifelse(sum(x)>0,T,F))
  7.                  
  8.                  data3[!ab,]
复制代码

已有 1 人评分学术水平 热心指数 收起 理由
qoiqpwqr + 1 + 1 热心帮助其他会员

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

地板
小洋仔 学生认证  发表于 2013-12-8 19:55:55
jmpamao 发表于 2013-12-7 23:58
这个是有问题的,return返回的值是 循环第一次的值。
##apply 后面插 for 循环的。其实真的是绕。
这个代码虽然很恶心,却也实现了功能。
b=NULL
for(i in 1:dim(data)[1]){
  for(j in 1:dim(data3)[1]){
    if(data3[j,1]==data[i,1]&data3[j,2]==data[i,2])
       b=c(b,j)
         }
}
data4=data3[-b, ]
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jmpamao + 1 + 1 + 1 循环是精典的,只是R有些短板

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

7
熊小贤 发表于 2013-12-10 21:18:11
jmpamao 发表于 2013-12-7 23:58
这个是有问题的,return返回的值是 循环第一次的值。
##apply 后面插 for 循环的。其实真的是绕。
啊 原来错的离谱了 在两位的基础上又改了下
aa = sapply(1:nrow(data3), function(i){
  a = sapply(1:nrow(data), function(j){
    return(all(data3[i,]==data[j,]))
  })
})
ab=apply(aa,2,function(x)ifelse(sum(x)>0,T,F))
ac = data3[!ab,]

这样感觉也可以

8
ntsean 发表于 2013-12-11 00:23:41
这个用sql的except很容易

9
jmpamao 发表于 2013-12-17 20:31:07
基于1、你的 data3=unique(data2) #不会有重复项
      2、data是被包含于data3
所以 从data3中剔去data
可以这么做:
  1. #合并为data4,必有重复项
  2. data4=rbind(data3,data)
  3. #通过duplicated从头计算和 从尾部计算把重复的项找到,即可
  4. data4[!(duplicated(data4,fromLast=T)+duplicated(data4)>0),]
复制代码
基于那个条件的两点,此方法是比较讨巧。



10
jmpamao 发表于 2013-12-17 21:19:01
推广:如果data 部分被包含于 data3要把data3中和data重复的项去除 可以:
  1. data4=rbind(data3,data,data)
  2. data4[!(duplicated(data4,fromLast=T)+duplicated(data4)>0),]
复制代码
#把data 重复两次合并到data4 中,然后去除重复项。oh yeah



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

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