我自己写了一个便利函数来替换导入数据中的空白(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
答案 0 :(得分:0)
与数据帧不同,矩阵必须为所有列提供相同的数据类型。您的函数使用apply
返回一个矩阵,因此如果只有一个列是data.frame
自动将字符串转换为的因子,则所有列都会被强制转换为因子。要检查是否属实,请尝试将stringsAsFactors = FALSE
添加到您的第一个data.frame
,然后查看您的结果是否全部为string