使用数据帧上的循环将NA替换为R中的0

时间:2013-10-15 14:37:47

标签: r

我想在数据帧中运行特定列,并使用循环替换所有NAs。

extract = read.csv("2013-09 Data extract.csv")
extract$Premium1[is.na(extract$Premium1)] <- 0
extract$Premium1

在数据框Premium1中为extract提供了所需的结果,但我想循环浏览所有27列保费,所以我正在尝试的是

extract = read.csv("2013-09 Data extract.csv")

for(i in 1:27) { 
  thispremium <- get(paste("extract$Premium", i, sep="")) 
  thispremium[is.na(thispremium)] <- 0
}

给出了

Error in get(paste("extract$Premium", i, sep = "")) : 
  object 'extract$Premium1' not found

有关导致错误的原因的任何想法吗?

2 个答案:

答案 0 :(得分:2)

怎么样

for (colname in names(extract))
  extract[[colname]][is.na(extract[[colname]])] <- 0

(甚至extract[is.na(extract)] <- 0

或者,如果您没有对所有列进行操作(我认为我误解了您的问题):

for(i in 1:27) { 
  colname <- paste0("Premium",i)
  extract[[colname]][is.na(extract[[colname]])] <- 0
}

或者,您实际上不需要知道这些列的数量:

premium <- grep("^Premium[0-9]*$",names(extract))
extract[premium][is.na(extract[premium])] <- 0

答案 1 :(得分:2)

您是否因为其他要求而需要循环?因为它没有一个就可以正常工作:

extract[is.na(extract)] <- 0

如果您只想替换某些列,请先选择这些列,执行替换,然后将列替换回原始集:

first5 <- extract[, 1 : 5]
first5[is.na(first5)] <- 0
extract[, 1 : 5] <- first5

更常见的是,循环可以(并且应该)在R中几乎避免 - 特别是在操作数据帧时)。通常操作会自动矢量化(如上所述)。如果不这样做,可以使用apply系列的功能。