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?

有帮助吗?

解决方案

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

其他提示

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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top