为什么此代码以WEIRD方式将数字数据框列转换为基于字符串的因子?

时间:2017-10-10 23:15:03

标签: r

我自己写了一个便利函数来替换导入数据中的空白(NA和NULL)值,但它表现得非常奇怪。

基本上,它将0和1强制为“0”和“1”而不是“0”和“1”(注意添加的空格字符)

这是功能

replace.blanks = function(dt, value="") {
  return(apply(dt, c(1,2), function(x) { 
    if (is.na(x) || is.null(x)) return(value) else return(x) 
  }))
}

以下是复制结果的代码

x = data.frame(
      a=c("Wasim", "Jorge", "Kiko", "Jenny"), 
      b=c(1, 0, NA, 1), 
      c=c(0,1,NA, NA)
    )
str(as.data.frame(replace.blanks(x, 0)))

可生产

'data.frame':   4 obs. of  3 variables:
 $ a: Factor w/ 4 levels "Jenny","Jorge",..: 4 2 3 1
 $ b: Factor w/ 3 levels " 0"," 1","0": 2 1 3 2
 $ c: Factor w/ 3 levels " 0"," 1","0": 1 2 3 3

但如果我只有数字列

y = data.frame(b=c(1, 0, NA, 1), c=c(0,1,NA, NA))
str(as.data.frame(replace.blanks(y, 0)))

相同的代码将生成

'data.frame':   4 obs. of  2 variables:
 $ b: num  1 0 0 1
 $ c: num  0 1 0 0

有谁可以解释发生了什么?为什么数字0和1转换为“0”和“1”只是因为其中一列是字符类型?

(编辑以在useR的回复后澄清我的问题:) 具体来说,为什么原版中的0变为“0”而不是“0”? (同样1s变为“1”而不是“1”)。

此外,为什么我最终会得到3个因子水平而不是像人们预期的那样2?

如果我将结果保留为矩阵,我的结果基本相同;我只是在示例代码中转换为数据框以使用str

1 个答案:

答案 0 :(得分:0)

与数据帧不同,矩阵必须为所有列提供相同的数据类型。您的函数使用apply返回一个矩阵,因此如果只有一个列是data.frame自动将字符串转换为的因子,则所有列都会被强制转换为因子。要检查是否属实,请尝试将stringsAsFactors = FALSE添加到您的第一个data.frame,然后查看您的结果是否全部为string