循环错误:替换长度为零

时间:2016-01-11 19:04:14

标签: r loops

我已经生成了以下假设数据集:

    df<-data.frame(read.table(header = TRUE, stringsAsFactors = FALSE, text = "
ID Age Rel_1 Age_1 Rel_2 Age_2 Rel_3 Age_3
1   .    Self  12   Dad    40   Mom   38  
2   .     Dad   50  Mom    50   Self  22
3   .    Granddad  75  Mom  40   Self 15
4   .     Dad  45  Self 15   Mom 44   
5   .    Mom 50 Sister 18  Self 22
"))

让每一行代表参与调查的受访者。让列Rel_1到Age_3代表调查受访者的家庭成员。 'Rel'代表关系。从这个家庭名单中,我想找回受访者的年龄。标记'Self'确实表明了它。因此,如果“自我”在Rel_2中,那么我知道调查受访者的年龄是12岁。

我想出了一种方法:

for(i in 1:nrow(df)) {
print(i)
a<-which(df[i,]=="Self")+1 
df[i,2]<-df[i,a]
}

工作正常。

但是,现在让我们在收集的数据中加入错误。我将第3行中的“Self”改为“Son”。数据收集过程中可能发生的一些小错误。

df<-data.frame(read.table(header = TRUE, stringsAsFactors = FALSE, text = "
ID Age Rel_1 Age_1 Rel_2 Age_2 Rel_3 Age_3
1   .    Self  12   Dad    40   Mom   38  
2   .     Dad   50  Mom    50   Self  22
3   .    Granddad  75  Mom  40   Son 15
4   .     Dad  45  Self 15   Mom 44   
5   .    Mom 50 Sister 18  Self 22
"))

如果我现在运行我以前的代码来提取有关年龄的信息。我收到以下错误消息:

  

[<-.data.frame*tmp*,i,2,value = list())出错:替换长度为零

事实上,它只提取有关年龄的信息,直到第2行。它似乎没有跳过第3行,并再次提取第4行和第5行的年龄信息。

谁有一些想法出了什么问题,我该怎样做才能'跳过'第3行,其中'Self'未指定?

由于

1 个答案:

答案 0 :(得分:1)

你必须动态处理错误,例如:

for(i in 1:nrow(df)) {
        print(i)
        a<-which(df[i,]=="Self")+1 
        if(length(a)>0)
           df[i,2]<-df[i,a]
}

或者您可以预先处理以删除有错误的行。