这是我的任务:
此数据集存在一些结构性问题,编写一个名为“ convert_number”的函数来完成以下任务: -更改列中的数字,以使“,”为“。” -将该列转换为双列
convert_number <- function(data, col) {
countries[col] <- as.character(countries[col])
countries[col] <- scan(text=countries[col], dec=",", sep=".") (countries[col] <- as.double())
}
convert_number("countries", "Net.migration")
我首先做了以下事情:
countries$Net.migration <- sub("^$", "0", countries$Net.migration)
为了将所有空格都更改为“ 0”,以便我可以切换逗号,但我意识到我的作业中还有一个问题要问列中的NA数量,所以我不能有“ 0”在那些单元格中。我想有一种比scan(text = ...)更好的方法?
我是一个初学者(尤其是具有函数的初学者),我认为我正在忽略一种更简单的方法。
这里是一个示例:tail(countries,5)
答案 0 :(得分:2)
convert_number <- function(x){
x <- as.character(x)
x <- gsub(pattern = ",", replacement = ".",x = x, fixed = TRUE)
x <- as.numeric(x)
return(x)
}
此功能将被矢量化,因此您可以这样调用它
data$Coastline..coast.area.ratio <- convert_number(data$Coastline..coast.area.ratio)
或者您可以调用它并应用于所有列
data <- apply(data, 2, convert_number)
答案 1 :(得分:0)
这里有一些步骤可以在不创建您自己的函数的情况下完成
#random numbers with commans
charnum <- c("324,34","345435,50","234324",NA)
#switch commas with .
charnum3 <- gsub(",",".",charnum)
#change to numeric
charnum3 <- as.numeric(charnum3)
#sum missing values
sum(is.na(charnum3))
df <- data.frame(charnum, stringsAsFactors = FALSE)
convert_number <- function(data,col) {
x1 <- gsub(",",".",data[[col]])
x2 <- as.numeric(x1)
return(x2)
}
df$charnum2 <- convert_number(df,"charnum")
答案 2 :(得分:-1)
这应该以简单的方式完成。使用函数,您需要了解何时传递对象(例如数据)或字符串(例如列名)。
convert_number <- function(data, col) {
data[[col]] <- as.numeric(gsub(",", ".", as.character(data[[col]])))
data
}
因此,您可以这样做:
convert_number(countries, "Net.Migration")
答案 3 :(得分:-1)
这是一个带有可复制示例的答案
df <- data.frame("V1" = c("2,78", "3,54", "1,09", "0,08"),
"V2" = c("2,78", NA, NA, "0,08"),
"V3" = c("23,78", "31,54", "11,09", "88,08"))
my_fun <- function(x){
x[, c(1:length(x))] <- lapply(x[, c(1:length(x))], function(k){
a <- gsub(",", ".", k, fixed = TRUE)
b <- as.numeric(a)
})
return(x)
}
res <- my_fun(df)
print(res)
V1 V2 V3
1 2.78 2.78 23.78
2 3.54 NA 31.54
3 1.09 NA 11.09
4 0.08 0.08 88.08