cbind replaces String with number?

我们两清 提交于 2019-12-19 07:36:26

问题


x = iris$Sepal.Width;
y = iris$Species;

m = cbind(x,y);

the output of m is:

        x  y
  [1,] 3.5 1
  [2,] 3.0 1
  [3,] 3.2 1
  [4,] 3.1 1
  [5,] 3.6 1
  [6,] 3.9 1

but I want 'setosa', etc in column y instead of a number

how can I do that?

I want to combine the 2 Vectors because I want to filter afterwards with

m[m[,"y"]=="virginica",]

or is ther another oportunity to do that without cbind?


回答1:


For vectors being combined with cbind, the result would be a matrix, which can only hold one type of data. Thus, the "Species" factor gets coerced to its underlying numeric value.

Try cbind.data.frame instead (or just data.frame) if you need your columns to have different data types.

> head(data.frame(x, y))
    x      y
1 3.5 setosa
2 3.0 setosa
3 3.2 setosa
4 3.1 setosa
5 3.6 setosa
6 3.9 setosa
> head(cbind.data.frame(x, y))
    x      y
1 3.5 setosa
2 3.0 setosa
3 3.2 setosa
4 3.1 setosa
5 3.6 setosa
6 3.9 setosa



回答2:


cbind() returns a matrix which has to be of a single class. In this case everything is converted to character because that is the most general class (you can express numbers as characters but not the other way around). R relies on data.frame to store columns of different classes.

To do what you want you can either explicitly create a new data.frame or use a subset of the current one:

iris2 <- data.frame(x=iris$Sepal.Width, y=iris$Species)  ## creates new data.frame
iris[, c("Sepal.Width", "Species")   ## returns subset of iris

If you post the problem you are trying to solve there may be a more streamlined way to do the filtering you want.



来源:https://stackoverflow.com/questions/23567625/cbind-replaces-string-with-number

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!