# How to Fix: attempt to set ‘colnames’ on an object with less than two dimensions

One error message you may encounter when using R is:

```Error in `colnames<-`(`*tmp*`, value = c("var1", "var2", "var3")) :
attempt to set 'colnames' on an object with less than two dimensions
```

This error usually occurs when you attempt to use the colnames() function to set the column names on an object that is not a data frame or matrix.

The following example shows how to resolve this error in practice.

## How to Reproduce the Error

Suppose we have the following data frame in R:

```#create data frame
df <- data.frame(team=c('A', 'A', 'C', 'B', 'C', 'B', 'B', 'C', 'A'),
points=c(12, 8, 26, 25, 38, 30, 24, 24, 15),
rebounds=c(10, 4, 5, 5, 4, 3, 8, 18, 22))

#view data frame
df

team points rebounds
1    A     12       10
2    A      8        4
3    C     26        5
4    B     25        5
5    C     38        4
6    B     30        3
7    B     24        8
8    C     24       18
9    A     15       22
```

Now suppose we attempt to add a new row to the end of the data frame:

```#define new row to add to end of data frame
new_row <- c('D', 15, 11)

#attempt to define column names for new row
colnames(new_row) <- colnames(df)

Error in `colnames<-`(`*tmp*`, value = c("team", "points", "rebounds")) :
attempt to set 'colnames' on an object with less than two dimensions
```

We receive an error because we used the colnames() function on a vector instead of a data frame or matrix.

## How to Fix the Error

To avoid this error, we need to make sure that we’re using the colnames() function with a data frame:

For example, we can use the following code to add a new row to the end of the data frame

```#define new row to add to end of data frame
new_row <- data.frame('D', 15, 11)

#define column names for new row
colnames(new_row) <- colnames(df)

#add new row to end of data frame
df <- rbind(df, new_row)

#view updated data frame
df

team points rebounds
1     A     12       10
2     A      8        4
3     C     26        5
4     B     25        5
5     C     38        4
6     B     30        3
7     B     24        8
8     C     24       18
9     A     15       22
10    D     15       11
```

This time we don’t receive any error because we used the colnames() function to define the column names of a data frame instead of a vector.

We’re then able to successfully use rbind() to bind the new row to the end of the existing data frame.