Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why are Xs added to data frame variable names when using read.csv?

When I use the read.csv() function in R to load data, I often find that an X has been added to variable names. I think I just about always see it it in the first variable, but I could be wrong.

At first, I thought R might be doing this because I had a space at the beginning of the variable name - I don't.

Second, I had read somewhere that if you have a variable that starts with a number, or is a very short variable name, R would add the X. The variable name is all text and the length of the name of this variable is 12 characters, so it's not short.

Now, this is purely an annoyance. I can rename the column, but it does add a step, albeit a small one.

Is there a way to prevent this from rogue X from infiltrating my data frame?

Here is my original code:

df <- read.csv("/file/location.filecsv", header=T, sep=",")

Here is the variable in question:

str(orders)
'data.frame':   2620276 obs. of  26 variables:
 $ X.OrderDetailID    : Factor w/ 2620193 levels "(2620182 row(s) affected)",..: 105845
like image 457
mikebmassey Avatar asked Feb 01 '12 15:02

mikebmassey


People also ask

What is a variable in a data frame?

Details. A data frame is a list of variables of the same number of rows with unique row names, given class "data. frame" . If no variables are included, the row names determine the number of rows. The column names should be non-empty, and attempts to use empty names will have unsupported results.

What does write CSV do in R?

R can create csv file form existing data frame. The write. csv() function is used to create the csv file. This file gets created in the working directory.

Which function in base R is used to read in a * .CSV file?

csv() Function. read. csv() function in R Language is used to read “comma separated value” files.

How do I remove a column from a Dataframe in R?

The most easiest way to drop columns is by using subset() function. In the code below, we are telling R to drop variables x and z. The '-' sign indicates dropping variables. Make sure the variable names would NOT be specified in quotes when using subset() function.


3 Answers

read.table and read.csv have a check.names= argument that you can set to FALSE.

For example, try it with this input consisting of just a header:

> read.csv(text = "a,1,b")
[1] a  X1 b 
<0 rows> (or 0-length row.names)

versus

> read.csv(text = "a,1,b", check.names = FALSE)
[1] a 1 b
<0 rows> (or 0-length row.names)
like image 199
G. Grothendieck Avatar answered Oct 13 '22 13:10

G. Grothendieck


It is surprising behavior, but I think we would need a reproducible example. Perhaps you have some invisible/special characters hiding in your file?

names(read.csv(textConnection(
"abcdefghijkl, a1,2x")))

behaves fine. Can you make an example along these lines that demonstrates your problem?

As described in the other answer, check.names=FALSE is a possible workaround. You can experiment with make.names to determine the behavior ...

like image 3
Ben Bolker Avatar answered Oct 13 '22 14:10

Ben Bolker


As Gabor said, by default read.csv deafults to converting the names in your header row to be valid variable names (use check.names = FALSE to turn this off). This is done using the function make.names. The help page for that function explains what constitutes a valid variable name.

A syntactically valid name consists of letters, numbers and the dot or underline characters and starts with a letter or the dot not followed by a number. Names such as ".2way" are not valid, and neither are the reserved words.

The list of reserved words is found on the help page ?reserved.

The other condition is that the variable name must be 10000 characters or less, but make.names won't shorten it. So be careful of being really verbose with your variable names.

You can check for valid variable names using

library(assertive.code)
is_valid_variable_name(x)
like image 3
Richie Cotton Avatar answered Oct 13 '22 14:10

Richie Cotton