for循环中的动态列名称

时间:2017-06-27 10:11:06

标签: r dynamic names

我的代码有问题。我有这样的数据框:

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_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

这是我的简单代码,但有些东西不起作用..

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 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 个答案:

答案 0 :(得分:2)

我们可以使用lapply遍历'data'列,检查元素是否为NA(is.na(x)),转换为整数(as.integer)并将输出分配给新栏目

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

答案 1 :(得分:0)

根据条件添加列:

 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

或者可以使用:

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)
}