Here is an example piece of code to illustrate an issue: rm(list=ls()) # Clear Workspace # Data1 <- matrix(data=rnorm(9,0,1),nrow=3,ncol=3) Colnames1 <- c("(A)","(B)","(C)") colnames(Data1) <- Colnames1 print(Data1) DataFrame1 <- data.frame(Data1) print(DataFrame1) colnames(DataFrame1) <- Colnames1 print(DataFrame1) The results I get are: (A) (B) (C) [1,] 0.4739417 1.3138868 0.4262165 [2,] -2.1288083 1.0333770 1.1543404 [3,] -0.3401786 -0.7023236 -0.2336880 X.A. X.B. X.C. 1 0.4739417 1.3138868 0.4262165 2 -2.1288083 1.0333770 1.1543404 3 -0.3401786 -0.7023236 -0.2336880 (A) (B) (C) 1 0.4739417 1.3138868 0.4262165 2 -2.1288083 1.0333770 1.1543404 3 -0.3401786 -0.7023236 -0.2336880 so that when I make the matrix with headings the parentheses are replaced by periods but I can add them after creating the data frame and the column headings are correct. Any ideas on why this occurs? Thanks Bernard McGarvey Director, Fort Myers Beach Lions Foundation, Inc. Retired (Lilly Engineering Fellow).
rm(list=ls()) is a bad practice... especially when posting examples. It doesn't clean out everything and it removes objects created by the user. Read ?data.frame, particularly regarding the check.names parameter. The intent is to make it easier to use DF$A notation, though DF$`(A)` is usable if you are somewhat experienced with R. On January 21, 2021 12:58:44 PM PST, Bernard McGarvey <mcgarvey.bernard at comcast.net> wrote:>Here is an example piece of code to illustrate an issue: > >rm(list=ls()) # Clear Workspace ># >Data1 <- matrix(data=rnorm(9,0,1),nrow=3,ncol=3) >Colnames1 <- c("(A)","(B)","(C)") >colnames(Data1) <- Colnames1 >print(Data1) >DataFrame1 <- data.frame(Data1) >print(DataFrame1) >colnames(DataFrame1) <- Colnames1 >print(DataFrame1) > >The results I get are: > > (A) (B) (C) >[1,] 0.4739417 1.3138868 0.4262165 >[2,] -2.1288083 1.0333770 1.1543404 >[3,] -0.3401786 -0.7023236 -0.2336880 > X.A. X.B. X.C. >1 0.4739417 1.3138868 0.4262165 >2 -2.1288083 1.0333770 1.1543404 >3 -0.3401786 -0.7023236 -0.2336880 > (A) (B) (C) >1 0.4739417 1.3138868 0.4262165 >2 -2.1288083 1.0333770 1.1543404 >3 -0.3401786 -0.7023236 -0.2336880 > >so that when I make the matrix with headings the parentheses are >replaced by periods but I can add them after creating the data frame >and the column headings are correct. > >Any ideas on why this occurs? > >Thanks > > >Bernard McGarvey >Director, Fort Myers Beach Lions Foundation, Inc. >Retired (Lilly Engineering Fellow). > >______________________________________________ >R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >https://stat.ethz.ch/mailman/listinfo/r-help >PLEASE do read the posting guide >http://www.R-project.org/posting-guide.html >and provide commented, minimal, self-contained, reproducible code.-- Sent from my phone. Please excuse my brevity.
Hi, data.frame() checks names by default to ensure that column names are legal, but there's an argument to change that.>From ?data.frame()check.names: logical. If ?TRUE? then the names of the variables in the data frame are checked to ensure that they are syntactically valid variable names and are not duplicated. If necessary they are adjusted (by ?make.names?) so that they are. Sarah On Thu, Jan 21, 2021 at 3:59 PM Bernard McGarvey <mcgarvey.bernard at comcast.net> wrote:> > Here is an example piece of code to illustrate an issue: > > rm(list=ls()) # Clear Workspace > # > Data1 <- matrix(data=rnorm(9,0,1),nrow=3,ncol=3) > Colnames1 <- c("(A)","(B)","(C)") > colnames(Data1) <- Colnames1 > print(Data1) > DataFrame1 <- data.frame(Data1) > print(DataFrame1) > colnames(DataFrame1) <- Colnames1 > print(DataFrame1) > > The results I get are: > > (A) (B) (C) > [1,] 0.4739417 1.3138868 0.4262165 > [2,] -2.1288083 1.0333770 1.1543404 > [3,] -0.3401786 -0.7023236 -0.2336880 > X.A. X.B. X.C. > 1 0.4739417 1.3138868 0.4262165 > 2 -2.1288083 1.0333770 1.1543404 > 3 -0.3401786 -0.7023236 -0.2336880 > (A) (B) (C) > 1 0.4739417 1.3138868 0.4262165 > 2 -2.1288083 1.0333770 1.1543404 > 3 -0.3401786 -0.7023236 -0.2336880 > > so that when I make the matrix with headings the parentheses are replaced by periods but I can add them after creating the data frame and the column headings are correct. > > Any ideas on why this occurs? > > Thanks > > > Bernard McGarvey > Director, Fort Myers Beach Lions Foundation, Inc. > Retired (Lilly Engineering Fellow). >-- Sarah Goslee (she/her) http://www.numberwright.com
On 21/01/2021 3:58 p.m., Bernard McGarvey wrote:> Here is an example piece of code to illustrate an issue: > > rm(list=ls()) # Clear Workspace > # > Data1 <- matrix(data=rnorm(9,0,1),nrow=3,ncol=3) > Colnames1 <- c("(A)","(B)","(C)") > colnames(Data1) <- Colnames1 > print(Data1) > DataFrame1 <- data.frame(Data1) > print(DataFrame1) > colnames(DataFrame1) <- Colnames1 > print(DataFrame1) > > The results I get are: > > (A) (B) (C) > [1,] 0.4739417 1.3138868 0.4262165 > [2,] -2.1288083 1.0333770 1.1543404 > [3,] -0.3401786 -0.7023236 -0.2336880 > X.A. X.B. X.C. > 1 0.4739417 1.3138868 0.4262165 > 2 -2.1288083 1.0333770 1.1543404 > 3 -0.3401786 -0.7023236 -0.2336880 > (A) (B) (C) > 1 0.4739417 1.3138868 0.4262165 > 2 -2.1288083 1.0333770 1.1543404 > 3 -0.3401786 -0.7023236 -0.2336880 > > so that when I make the matrix with headings the parentheses are replaced by periods but I can add them after creating the data frame and the column headings are correct. > > Any ideas on why this occurs?By default, data.frame() uses names that are legal variable names, so you can do things like Data1$X.A. You can stop this change by saying DataFrame1 <- data.frame(Data1, check.names=FALSE) Duncan Murdoch
it looks to me that the names are cranked through make.names for data frames case while that doesn't happen for matrices. Peeking into the `colnames<-` code supports this idea, but that in turn uses `names<-` which is a primitive and so defies further easy peeking. The data.frame function provides the check.names parameter to switch this on / off, but for other classes this checking doesn't seem to be provided. Perhaps the idea behind this discrepancy is to enable the use of the $ operator to access columns of the data frame, while that's not possible for matrices anyway. (Personally, I don't find the results of make.names that useful, though, and I tend to sanitise them myself when working with data frames with unwieldy column names). Best regards, Jan On Thu, Jan 21, 2021 at 03:58:44PM -0500, Bernard McGarvey wrote:> Here is an example piece of code to illustrate an issue: > > rm(list=ls()) # Clear Workspace > # > Data1 <- matrix(data=rnorm(9,0,1),nrow=3,ncol=3) > Colnames1 <- c("(A)","(B)","(C)") > colnames(Data1) <- Colnames1 > print(Data1) > DataFrame1 <- data.frame(Data1) > print(DataFrame1) > colnames(DataFrame1) <- Colnames1 > print(DataFrame1) > > The results I get are: > > (A) (B) (C) > [1,] 0.4739417 1.3138868 0.4262165 > [2,] -2.1288083 1.0333770 1.1543404 > [3,] -0.3401786 -0.7023236 -0.2336880 > X.A. X.B. X.C. > 1 0.4739417 1.3138868 0.4262165 > 2 -2.1288083 1.0333770 1.1543404 > 3 -0.3401786 -0.7023236 -0.2336880 > (A) (B) (C) > 1 0.4739417 1.3138868 0.4262165 > 2 -2.1288083 1.0333770 1.1543404 > 3 -0.3401786 -0.7023236 -0.2336880 > > so that when I make the matrix with headings the parentheses are replaced by periods but I can add them after creating the data frame and the column headings are correct. > > Any ideas on why this occurs? > > Thanks > > > Bernard McGarvey > Director, Fort Myers Beach Lions Foundation, Inc. > Retired (Lilly Engineering Fellow). > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.