我想在数据帧中运行特定列,并使用循环替换所有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
有关导致错误的原因的任何想法吗?
答案 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
系列的功能。