2014-02-13 29 views
2

任何人都可以系统地向我解释使用rbind和data.frame时字符/数字/因子之间的类型转换的层次结构吗?rbind/data.frame转换类型层次结构R

在我的理解中,rbind放在一个矩阵中,它只能有一个类型。所以如果存在类型冲突,那么将转换为什么类型?其他类型的矩阵创建功能(例如cbind,matrix)是否以相同的方式工作?例如:

> sapply(rbind("a", "b"), class) 
     a   b 
"character" "character" 
> sapply(rbind(1, "b"), class) 
      1   b 
"character" "character" 

在另一方面,数据帧可以容纳多种类型的,所以data.frame保留原始类型,除了它总是试图字符转换为的因素。 (这是否正确?这对我来说是非常直观的。)

使用相同的逻辑,它是否正确,因素类型将始终保持因子,无论它是否为factor(c(1,2))factor(c("a", "b"))

> sapply(data.frame("a", "b"), class) 
    X.a.  X.b. 
"factor" "factor" 
> sapply(data.frame(1, "b"), class) 
     X1  X.b. 
"numeric" "factor" 
> sapply(data.frame(1, factor("a")), class) 
    X1 factor..a.. 
    "numeric" "factor" 
+0

在'data.frame'或您的全局选项中看到'stringsAsFactors'参数。 – Justin

+0

我知道有这样的事情。我要求系统地解释什么类型在转换中具有优先权。 – Heisenberg

回答

3

看一看的?cbind(或?rbind)的部分:

“的矩阵结果的从最高类型的任何的输入层次结构中的原始<逻辑确定的类型<整数<双<复杂<字符<列表”

取决于层次的一些强制的例子:

# logical 
a <- c(FALSE, TRUE) 

# integer 
b <- 0:1 

# double 
c <- c(0, 1.0) 

# character 
d <- c("0", "1") 


m1 <- cbind(a, b) 
m1 
str(m1) 
# logical converted to integer 

m2 <- cbind(b, c) 
m2 
str(m2) 
# integer converted to double 

m3 <- cbind(c, d) 
m3 
str(m3) 
# double converted to character 

还可参见?cbind数据帧的方法”。

+0

该列表中的因素在哪里? – Heisenberg

+0

整数。检查'f1 < - 因子(0:1)'; 'f2 < - factor(c(“0”,“1”))'; '的typeof(F1)'; '的typeof(F2)'。参见'?factor':“类”factor“的一个对象,它具有一组整数代码,x的长度和模式字符的”levels“属性”。 – Henrik