30

考虑以下 R 代码。

> x = cbind(c(10, 20), c("[]", "[]"), c("[[1,2]]","[[1,3]]"))
> x
     [,1] [,2] [,3]     
[1,] "10" "[]" "[[1,2]]"
[2,] "20" "[]" "[[1,3]]"

相似地

> x = rbind(c(10, "[]", "[[1,2]]"), c(20, "[]", "[[1,3]]"))
> x
     [,1] [,2] [,3]     
[1,] "10" "[]" "[[1,2]]"
[2,] "20" "[]" "[[1,3]]"

10现在,我不希望将整数20转换为字符串。在没有任何此类转换的情况下如何执行此操作?我当然也想知道为什么会发生这种转换。我查看了cbind帮助并尝试了谷歌搜索,但没有找到解决方案。我也相信在某些情况下。R 将字符串转换为因子,我也不希望这种情况发生,尽管它似乎没有在这里发生。

4

2 回答 2

47

向量和矩阵只能是单一类型,cbind并且rbind在向量上会给出矩阵。在这些情况下,数值将被提升为字符值,因为该类型将保存所有值。

(请注意,在您的rbind示例中,促销发生在c通话中:

> c(10, "[]", "[[1,2]]")
[1] "10"      "[]"      "[[1,2]]"

如果你想要一个列可以是不同类型的矩形结构,你需要一个data.frame. 以下任何一项都可以满足您的需求:

> x = data.frame(v1=c(10, 20), v2=c("[]", "[]"), v3=c("[[1,2]]","[[1,3]]"))
> x
  v1 v2      v3
1 10 [] [[1,2]]
2 20 [] [[1,3]]
> str(x)
'data.frame':   2 obs. of  3 variables:
 $ v1: num  10 20
 $ v2: Factor w/ 1 level "[]": 1 1
 $ v3: Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2

或(专门使用 的data.frame版本cbind

> x = cbind.data.frame(c(10, 20), c("[]", "[]"), c("[[1,2]]","[[1,3]]"))
> x
  c(10, 20) c("[]", "[]") c("[[1,2]]", "[[1,3]]")
1        10            []                 [[1,2]]
2        20            []                 [[1,3]]
> str(x)
'data.frame':   2 obs. of  3 variables:
 $ c(10, 20)              : num  10 20
 $ c("[]", "[]")          : Factor w/ 1 level "[]": 1 1
 $ c("[[1,2]]", "[[1,3]]"): Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2

或(使用cbind,但制作第一个 adata.frame以便它像 data.frames 一样组合):

> x = cbind(data.frame(c(10, 20)), c("[]", "[]"), c("[[1,2]]","[[1,3]]"))
> x
  c.10..20. c("[]", "[]") c("[[1,2]]", "[[1,3]]")
1        10            []                 [[1,2]]
2        20            []                 [[1,3]]
> str(x)
'data.frame':   2 obs. of  3 variables:
 $ c.10..20.              : num  10 20
 $ c("[]", "[]")          : Factor w/ 1 level "[]": 1 1
 $ c("[[1,2]]", "[[1,3]]"): Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2
于 2012-10-08T18:49:37.930 回答
15

使用data.frame而不是cbind应该有帮助

x <- data.frame(col1=c(10, 20), col2=c("[]", "[]"), col3=c("[[1,2]]","[[1,3]]"))
x
  col1 col2    col3
1   10   [] [[1,2]]
2   20   [] [[1,3]]

sapply(x, class) # looking into x to see the class of each element
     col1      col2      col3 
"numeric"  "factor"  "factor" 

如您所见, col1 中的元素numeric如您所愿。

data.frame可以有不同的变量class: numeric,但没有,一旦你将一个factor元素放入矩阵中,所有其他元素都将进入这个类,无论它们之前是什么类。charactermatrixcharacter

于 2012-10-08T18:45:08.490 回答