楼主: 蝇子
15144 13

[问答] [继续求助]R合并数据集语句 [推广有奖]

  • 5关注
  • 2粉丝

讲师

70%

还不是VIP/贵宾

-

威望
0
论坛币
4798 个
通用积分
14.1678
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
802 点
帖子
163
精华
0
在线时间
890 小时
注册时间
2006-4-22
最后登录
2025-6-9

楼主
蝇子 发表于 2008-8-9 16:11:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我有两个数据文件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。运行出来不是这样。谢谢了

二维码

扫码加我 拉你入群

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

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

关键词:合并数据 数据集 Total 数据文件 TOT 数据集 语句

回帖推荐

birdnick 发表于2楼  查看完整内容

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

birdnick 发表于4楼  查看完整内容

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一定要分清的。

本帖被以下文库推荐

沙发
birdnick 发表于 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编辑过]

板凳
birdnick 发表于 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
能帮我再看看么??还有这个字符型的挺麻烦的哈,必须转为向量,对不?

再次感谢

地板
birdnick 发表于 2008-8-16 09:39:00


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

[em01]

7
蝇子 发表于 2008-8-16 12:28:00

呵呵,真是不好意思太粗心了。

我还想问的是这种除了可以用循环,R中有没有函数可以直接做的。用循环的话容易出错,而且数据多的话还容易出错。

非常非常感谢birdnick!!

8
birdnick 发表于 2008-8-16 16:22:00

呵呵,这种步骤 只要是先去 match 一下,然后赋值,

 

你可以try一下,match一下,找到后赋值哦, 自己试一下吧,

coding 能力还是要锻炼的,这点时间长了还是不会出问题的

good luck!!
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
我的素质低 + 20 + 5 + 5 精彩帖子

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

9
蝇子 发表于 2008-8-16 23:07:00

Thank you very much!

以后能不能经常找你问问题啊?

10
birdnick 发表于 2008-8-17 02:43:00
嘿嘿,估计应该没问题,发帖子就可以啦,我应该经常在潜水

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

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