楼主: zjk0507
4563 10

[问答] 请大家帮我看一下这个程序,希望可以得到大家的点拨,给出程序建议!谢谢 [推广有奖]

  • 0关注
  • 0粉丝

本科生

49%

还不是VIP/贵宾

-

威望
0
论坛币
11 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
7897 点
帖子
30
精华
0
在线时间
148 小时
注册时间
2010-11-1
最后登录
2022-1-21

1论坛币
>library(foreign)
> setwd("E:/SAS data")#指定路径
>a1<-list.files()
> a1
[1] "final1csv" "final2csv" "final3csv"
"final4csv" "final5csv" "final6csv"#文件夹内共有6个数据集(模拟生成,均包含相同变量,其中变量y包含缺失数据)
>for (x1 in a1) {
> Rdata1<-read.csv(x1)
> print(Rdata1)
} #读入这6个csv格式数据集
到现在为止运行没有任何问题,问题在下面的程序
>library(Amelia) #对Rdata1中这6个数据集的y用amelia这个包进行填补
>for (x1 in a1) {
> while(d==1) #这一步有个问题,由于d是数据集中的二分类变量:0和1,我想用d=1的个体的数 据对y进行填补(用下面的amelia),而d=0的那些个体的全部数据都不用,但是输出时要保留。估计这句写得不对,因为提示错误了...(见底部)
>Rdata1.out<-amelia(x=Rdata1,m=5,p2s=0,startvals=0,logs="y",
> idvars = c("rho", "nu","Rnum","y0","d0","c","d","y1","rind"))
> write.amelia(obj=Rdata1.out,file.stem="E:/Rdata/Rdata",format = "csv")#这里存在个问题就是write.amelia输出的只有"final6csv"1个数据集的填补结果,但我想要的是这6个数据集的结果,请问这里应该怎么编写程序啊?
>print(Rdata1.out)还有这里也是只出来一个数据集的结果,怎么才能6个都出来
}
这段程序运行后出现:错误: 找不到对象'd'
这段程序最终想要的结果就是给每个数据集填补5次,这样每个数据集最后生成一个文件夹,共6个,每个夹子里面都有5个填补好的数据集(填补就是用amelia就解决了)
别嫌我啰嗦,主要也是希望尽量吧问题给大家解释清楚,可能有些问题有些简单,但我现在真是需要大家的帮助,非常感谢!

最佳答案

qoiqpwqr 查看完整内容

for (x1 in a1) { Rdata1
关键词:Library Foreign format RData final 文件夹 library foreign

回帖推荐

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

for (x1 in a1) { Rdata1
沙发
qoiqpwqr 发表于 2012-2-12 11:30:08 |只看作者 |坛友微信交流群
for (x1 in a1) {
Rdata1 <- read.csv(x1)
d <- Rdata1$d
subdata <- Rdata1[d == 1, ]
Rdata1.out<-amelia(x=subdata, .....)
write.amelia(....)

这只是填补d=1的那些缺失数据,d=0相对应的缺失数据还是缺失的。
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
aspenroad + 1 + 1 + 1 热心帮助其他会员
ywh19860616 + 1 + 1 + 1 我很赞同

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

使用道具

藤椅
qoiqpwqr 发表于 2012-2-12 23:55:22 |只看作者 |坛友微信交流群
你先运行
for (x1 in a1) {
Rdata1<-read.csv(x1)
print(Rdata1)
}
的时候,Rdata1只是你的最后是final6csv文件

你应该读入一个文件然后处理,完了之后再读入第二个文件。。。
for (x1 in a1) {
Rdata1 <- read.csv(x1)
d <- Rdata1$d
while (d == 1)
....

使用道具

板凳
zjk0507 发表于 2012-2-13 15:04:01 |只看作者 |坛友微信交流群
qoiqpwqr 发表于 2012-2-12 23:55
你先运行
for (x1 in a1) {
Rdata1
我按照;楼主的方式运行了,但是总警告:
In while (d == 1) Rdata1.out <- amelia(x = Rdata1, m = 5, p2s = 0,  :
  条件的长度大于一,因此只能用其第一元素
这是怎么回事啊

使用道具

报纸
zjk0507 发表于 2012-2-13 15:05:17 |只看作者 |坛友微信交流群
还有请问版主个问题啊,就是该如何同时输出6个数据集的填补结果啊 ,现在的write只输出一个数据集的

使用道具

地板
zjk0507 发表于 2012-2-14 23:05:44 |只看作者 |坛友微信交流群
qoiqpwqr 发表于 2012-2-13 21:52
for (x1 in a1) {
Rdata1
这个倒是没关系,我模拟的数据里,只有d=1的个体含有缺失值,d=0的个体没有,我分开目的就是为了不用d=0的个体数据,只用d=1的个体数据进行填补,填补后再把d=1的个体(填补好的数据)和d=0的个体合并,最后将这6个数据集的全部填补数据集输出到某个文件夹内,以备用作其他分析

使用道具

7
zjk0507 发表于 2012-2-15 00:34:52 |只看作者 |坛友微信交流群
qoiqpwqr 发表于 2012-2-13 21:52
for (x1 in a1) {
Rdata1
library(foreign)
setwd("E:/SAS data/新建文件夹 csv")
a1<-list.files()

Rdata <- list()
for (i in seq_along(a1)) {
    Rdata[[ i ]] <- read.csv(a1[ i ])
    print(Rdata[[ i ]])
}

#用EMB对Rdata1进行填补
>library(Amelia)
Rdata.out <- list()
Rdata.rest <- list()
for (i in seq_along(a1)) {
    d1 <- subset(Rdata[[ i ]], d == 1)
    Rdata.rest[[ i ]] <- subset(Rdata[[ i ]], d == 0)
    Rdata.out[[ i ]] <- amelia(x=d1,m=5..."))
write.amelia(obj=Rdata.out[[ i ]],file.stem="E:/Rdata/impute",format = "csv")
}
Rdata.imp <-rbind(do.call(rbind,Rdata.out),do.call(rbind,Rdata.rest)

最后一句好像有问题,总是提示:错误于rbind(deparse.level, ...) : 变量的列数不对!
现在的主要问题是:填补时我选择的填补次数是5次,例如对于第一个数据集final1,我们会针对该数据集里d=1个体中的所有缺失数据都填补5次,其他非缺失数据不变;这样final1就会产出5个填补好的数据集,然后这5个由final1得出填补数据集再分别加上相同的d=0个体的数据(也是final1中的)最后得出完整的数据集以备分析,以此类推...我给出的例子是6个,其实这样的数据我模拟产生了100个...
     我这里用的是笨办法,把数据集先拆开填补,然后在合并,好像版主的程序更简单,只是我实在不知道接下来该如何编才能完成我的意图,我倒是愿意再追加悬赏论坛币以求解决,非常感谢!

使用道具

8
qoiqpwqr 发表于 2012-2-15 09:27:29 |只看作者 |坛友微信交流群
你看一下Rdata.out的格式是什么。比如
Rdata.out[[1]]
不是一个data frame,应该是Rdata.out[[1]]$imputations$imp1

使用道具

9
qoiqpwqr 发表于 2012-2-15 09:33:29 |只看作者 |坛友微信交流群
你看一下Rdata.out的格式是什么。比如
Rdata.out[[1]]
不是一个data frame,应该是Rdata.out[[1]]$imputations$imp1
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
aspenroad + 1 + 1 + 1 热心帮助其他会员
耕耘使者 + 1 + 1 热心帮助其他会员

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

使用道具

10
zjk0507 发表于 2012-2-15 11:23:51 |只看作者 |坛友微信交流群
qoiqpwqr 发表于 2012-2-15 09:33
你看一下Rdata.out的格式是什么。比如
Rdata.out[[1]]
不是一个data frame,应该是Rdata.out[[1]]$imputa ...
这个格式应该怎么查看啊?还有data frame是Rdata.out[[1]]$imputations$imp1的话,是不是也用通过重新建立一个for循环来输出write.amelis()才能输出全部数据

使用道具

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

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

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

GMT+8, 2024-4-28 19:49