3

我想遍历数据框中的特定列,并使用循环将所有 NA 替换为 0。

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

Premium1给了我在 dataframe中所需的结果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

关于导致错误的原因有什么想法吗?

4

2 回答 2

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
于 2013-10-15T14:44:56.663 回答
2

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

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

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

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

更一般地说,在 R 中几乎可以(并且应该)避免循环——尤其是在处理数据帧时)。通常操作会自动矢量化(如上)。如果他们不这样做,apply则可以使用家庭的功能。

于 2013-10-15T14:55:55.433 回答