在数据帧中将连字符转换为零,然后将受影响的列转换为R中的数字

时间:2012-11-20 09:54:51

标签: r

我有数据集,其中使用连字符代替数字零,如下面的示例数据集my.data中所示。我可以用零替换连字符,但是无法将受影响的列转换为数字。我的实际数据集非常大,有很多列,我不知道哪些列包含连字符。数据集也太大而且复杂,我觉得在将数据集读入R之前在数据集本身中使用“查找和替换”感觉很舒服。

我认为实际数据集的前三列是字符,其余列应该是数字(如果它不是连字符)。是否有一种有效且通用的方法将所有带连字符的列转换为数字而不知道它们是哪些列?

我在下面介绍一种方式,但看起来相当麻烦。

我在这里发现了很多类似的帖子,但它们似乎一般都在询问如何用其他东西替换缺失的观察或如何将特定的已知因子列转换为字符或数字格式。我没有找到任何处理这个特定问题的帖子,其中需要转换的特定列是未知的,尽管我可能忽略了它们。谢谢你的任何建议。

my.data <- read.table(text = "
landuse units grade Clay    Lincoln    Basin     McCartney     Maple
apple   acres AAA     1         -          3             4         6
apple   acres AA   1000       900         NA            NA       700
pear    acres AA   10.0        20         NA          30.0         -
peach   acres AAA   500        NA        350           300       200
", sep = "", header = TRUE, stringsAsFactors = FALSE, na.string=c('NA'))

my.data
str(my.data)

my.data[my.data == '-'] = '0'

as.numeric(my.data[,4:dim(my.data)[2]])

# Error: (list) object cannot be coerced to type 'double'

# The two lines below work but are too specific
# my.data$Lincoln <- as.numeric(my.data$Lincoln)
# my.data$Maple   <- as.numeric(my.data$Maple)

str(my.data)

# Here I unlist the columns I want to be numeric,
# convert them to a numeric matrix and then create a data frame.
# But this seems cumbersome.

un.my.data <- unlist(my.data[,4: dim(my.data)[2]])
un.my.data <- as.numeric(un.my.data)

my.data.2 <- matrix(un.my.data, nrow=dim(my.data)[1], byrow=F)
colnames(my.data.2) <- names(my.data)[4:dim(my.data)[2]]

new.data <- data.frame(my.data[,1:3], my.data.2)
new.data
str(new.data)

3 个答案:

答案 0 :(得分:3)

使用sapplygsub一个命令可以完成连字符的转换和转换为数字:

cbind(my.data[ , 1:3],
      sapply(my.data[ , -(1:3)], function(x) as.numeric(gsub("^-$", "0", x))))


  landuse units grade Clay Lincoln Basin McCartney Maple
1   apple acres   AAA    1       0     3         4     6
2   apple acres    AA 1000     900    NA        NA   700
3    pear acres    AA   10      20    NA        30     0
4   peach acres   AAA  500      NA   350       300   200

答案 1 :(得分:3)

使用正则表达式将-替换为0,然后转换为数字。在lapply

中包含所有这些内容
my.data[-(1:3)] <- lapply(
  my.data[-(1:3)], 
  function(x)as.numeric(gsub("-", 0, x))
)

my.data
  landuse units grade Clay Lincoln Basin McCartney Maple
1   apple acres   AAA    1       0     3         4     6
2   apple acres    AA 1000     900    NA        NA   700
3    pear acres    AA   10      20    NA        30     0
4   peach acres   AAA  500      NA   350       300   200

答案 2 :(得分:0)

而不是

as.numeric(my.data[,4:dim(my.data)[2]])

试试这个:

my.data[,-(1:3)] <-
  matrix(as.numeric(as.matrix(my.data[,-(1:3))),nrow=nrow(my.data))
str(my.data)

请注意,我使用[,-(1:3)]取了“除前三列之外的所有列”,这比[,4: dim(my.data)[2]]略微清晰。