全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
15044 13
2008-08-09
我有两个数据文件sh1和sh2。其中sh1:ID               aa                aa                bb               cc             ddsh2:ID          TOTAL          aa              150         bb               100          cc                60现在我想把根据sh2,将sh1变成:ID   TOTAL                                                      aa     150                                                      aa      150                                                      bb       100                                                       cc      60                                                      dd       0我写的语句是:n1<-length(sh1$ID);n2<-length(sh2$ID);                   for(i in 1:n2){for(j in 1:n1) if(sh1$ID[j]==sh2$ID) sh1$TOTAL[j]<-sh2$TOTAL}}这时候根本达不到我的目的:数据1中ID如果在数据2ID中没有的话,其TOTAL赋予0。运行出来不是这样。谢谢了

二维码

扫码加我 拉你入群

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

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

全部回复
2008-8-14 07:15:00


n1<-length(sh1$ID)
n2<-length(sh2$ID)

for(i in 1:n1)
{
 for(j in 1:n2)
 if(sh1$ID[j]==sh2$ID)
  sh1$TOTAL[i]<-sh2$TOTAL[j]
}

 

你那个n2 和n1的位置写反了,所以程序只执行了3次,后面的数据都没有执行,所以啦。

 

PS:强烈建议写代码的时候,程序的可读性一定要强,不然回头程序的重复利用的时候,修改起来很麻烦的。改起来可能有点痛苦,但the earlier ,the better

二维码

扫码加我 拉你入群

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

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

2008-8-14 23:57:00

我用楼上写的语句试了下x<-data.frame(mm=c("a","b","c","d"),pp=c(0,0,0,0))
y<-data.frame(mm=c("a","b","c"), pp=c(10,20,30))
for(i in 1:4)
{for(j in 1:3)
{if(x$mm[j]==y$mm) x$pp<-y$pp[j]}
}

还是不行的啊。出现提示“错误于Ops.factor(x$mm,y$pp[j]):因子的层次集不同”。

我写的语句是x<-data.frame(mm=c("a","b","c","d"),pp=c(0,0,0,0))
y<-data.frame(mm=c("a","b","c"), pp=c(10,20,30))
for(j in 1:4)
{for(i in 1:3)
{if(x$mm==y$mm[j]) x$pp<-y$pp[j]}
}

出现提示“错误于Ops.factor(x$mm, y$mm[j]):因子的层次集不同”

怎么办呢?

[此贴子已经被作者于2008-8-15 8:18:13编辑过]

二维码

扫码加我 拉你入群

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

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

2008-8-15 23:59:00

x<-data.frame(mm=c("a","b","c","d"),pp=c(0,0,0,0))
y<-data.frame(mm=c("a","b","c"), pp=c(10,20,30))

你可以试一下 as.factor(x)试一下,TRUE!所以你要是让两个factor相等那是不可能的,所以把他转成向量 就ok了,记住字符型的哦


for(i in 1:4)
{
 for(j in 1:3)
 {
  if(as.vector(x$mm)==as.vector(y$mm[j])) x$pp<-y$pp[j]
 }
}

PS:提醒你,编程的时候 i和 j一定要分清的。

二维码

扫码加我 拉你入群

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

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

2008-8-16 08:08:00

非常感谢birdnick!

现在可以了。这里关键是字符型的问题。i和j可以是你那样也可以是我那样。我两者都试了都可以的。

现在我想问的是如果x<-data.frame(mm=c("a","a","d","b","c","d"),pp=c(0,0,0,0,0,0))
y<-data.frame(mm=c("a","b","c"), pp=c(10,20,30))
for(i in 1:4)
{
 for(j in 1:3)
 {
  if(as.vector(x$mm)==as.vector(y$mm[j])) x$pp<-y$pp[j]
 }
}

出来的结果又有问题了

 x
  mm pp
1  a 10
2  a 10
3  d  0
4  b 20
5  c  0
6  d  0
能帮我再看看么??还有这个字符型的挺麻烦的哈,必须转为向量,对不?

再次感谢

二维码

扫码加我 拉你入群

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

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

2008-8-16 09:39:00


唉,你那个计数出了问题,只到4,没有到最后 length(x$mm)和length(y$mm)吧,这回就没问题了

[em01]
二维码

扫码加我 拉你入群

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

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

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

分享

扫码加好友,拉您进群