2017-06-27 11 views
1

私のコードに問題があります。forループの動的列名

for(i in c(1:ncol(data))) 
    { 
    data[, ncol(data) + 1] <- ifelse(is.na(data[i]), 1, 0) 
    names(data)[ncol(data)] <- paste0(colnames(data[i]), "_NA") 
    } 
...ここ

A B A_NA B_NA 
1 21 3 0 0 
2 234 NA 0 1 
3 NA NA 1 1 
4 286 8 0 0 
5 NA 10 1 0 

は私の単純なコードですが、何かが動作しません:私はこのようなデータフレームを持っている:

A <- c(21, 234, NA, 286,NA) 
B <- c(3,NA,NA, 8, 10) 
data <- data.frame(A,B) 
data 

    A B 
1 21 3 
2 234 NA 
3 NA NA 
4 286 8 
5 NA 10 

そして、私が作成する効果があります

効果は:

A B A A B A A 
1 21 3 0 0 0 0 0 
2 234 NA 0 0 1 0 0 
3 NA NA 1 1 1 0 0 
4 286 8 0 0 0 0 0 
5 NA 10 1 1 0 0 0 

答えて

2

条件に基づいて、列を追加

data[paste0(names(data), "_NA")] <- lapply(data, function(x) as.integer(is.na(x))) 
data 
# A B A_NA B_NA 
#1 21 3 0 0 
#2 234 NA 0 1 
#3 NA NA 1 1 
#4 286 8 0 0 
#5 NA 10 1 0 
+0

@DominikaJは、コメントをいただき、ありがとうございます。また、[ここ](https://stackoverflow.com/help/someone-answers) – akrun

0

を、「データ」の列をループにlapplyを使用する要素がNA(is.na(x))であるかどうかを確認、(as.integer)整数に変換して新しい列に出力を割り当てる:

再帰的
data$A_NA<-ifelse(is.na(data$A),1,0) 
data$B_NA<-ifelse(is.na(data$B),1,0) 

添加

for(nm in names(data)) 
    eval(parse(text = paste0("data$",nm,"_NA<-ifelse(is.na(data$",nm,"),1,0)"))) 

addition2

代わりに1を使用することができます。

for(nm in names(data)){ 
    assign(paste0(nm,"_NA"), ifelse(is.na(data[nm]),1,0)) 
    tempo<-data.frame(get(paste0(nm,"_NA")));names(tempo)<-paste0(nm,"_NA") 
    data<-cbind(data,tempo) 
} 
+0

をチェックすることもできますが、私は1000列あり、この場合はループが必要です –

+2

この種のための 'for'ループは必ずしも間違っています(例えば、名前(データ)のnm){data [paste0(nm、 "_ NA")] < - as.integer(is.na(データ[nm]))} ' – thelatemail