[R] Tying to underdressed the magic of lm redux

Richard O'Keefe r@oknz @end|ng |rom gm@||@com
Sun Jun 2 04:51:53 CEST 2019


PS:  lm records a copy of the call in its result, but has no other use
for any name the data frame may have had.

On Sun, 2 Jun 2019 at 14:45, Richard O'Keefe <raoknz using gmail.com> wrote:

> You can find the names of the columns of a dataframe using
>   colnames(my.df)
> A dataframe is a value just as much as a number is, and as such,
> doesn't _have_ a name.  However, when you call a function in R,
> the arguments are not evaluated, and their forms can be recovered,
> just as "plot" does.  In fact, looking at plot to see how it does
> that is a good idea.
>
> demo <- function (df) {
>    list(name = deparse(substitute(df)), cols = colnames(df))
> }
>
> my.df <- data.frame(x = c(1,2), y = c(3,4))
>
> demo(my.df)
>
> $name
> [1] "my.df"
>
> $cols
> [1] "x" "y"
>
>
>
>
> On Sun, 2 Jun 2019 at 13:43, Sorkin, John <jsorkin using som.umaryland.edu>
> wrote:
>
>> Colleagues,
>>
>> Despite Bert having tried to help me, I am still unable to perform a
>> simple act with a function. I want to pass the names of the columns of a
>> dataframe along with the name of the dataframe, and use the parameters to
>> allow the function to access the dataframe and modify its contents.
>>
>> I apologize multiple postings regarding this question, but it is a
>> fundamental concept that one who wants to program in R needs to know.
>>
>> Thank  you,
>> John
>>
>> # Create a toy dataframe.
>> df <- data.frame(a=c(1:20),b=(20:39))
>> df
>>
>>
>> # Set up a function that will access the first and second columns of the
>> # data frame, print the columns of the dataframe and add the columns
>> demo <- function(first,second,df)
>> {
>>   # None of the following work
>>   print(df[,all.vars(first)])
>>   print(df[,first])
>>   print(df[,"first"])
>>
>>   print(df[,all.vars(second)])
>>   print(df[,second])
>>   print(df[,"second"])
>>
>>   df[,"sum"] <- print(df[,first])+print(df[,second])
>>
>> }
>> demo(a,b, df)
>>
>>
>>
>>
>>
>> John David Sorkin M.D., Ph.D.
>> Professor of Medicine
>> Chief, Biostatistics and Informatics
>> University of Maryland School of Medicine Division of Gerontology and
>> Geriatric Medicine
>> Baltimore VA Medical Center
>> 10 North Greene Street
>> GRECC (BT/18/GR)
>> Baltimore, MD 21201-1524
>> (Phone) 410-605-7119
>> (Fax) 410-605-7913 (Please call phone number above prior to faxing)
>>
>>
>> ________________________________
>> From: Bert Gunter <bgunter.4567 using gmail.com>
>> Sent: Wednesday, May 29, 2019 11:27 PM
>> To: Sorkin, John
>> Cc: r-help using r-project.org
>> Subject: Re: [R] Tying to underdressed the magic of lm redux
>>
>> Depends on how you want to specify variables. You are not clear (to me)
>> on this. But, for instance:
>>
>> demo <- function(form,df)
>> {
>>    av <- all.vars(form)
>>    df[,av]
>> }
>> demo(~a+b, df)
>> demo(a~b,df)
>>
>> ?all.vars, ?all.names  for details
>>
>> Bert Gunter
>>
>>
>> On Wed, May 29, 2019 at 7:33 PM Sorkin, John <jsorkin using som.umaryland.edu
>> <mailto:jsorkin using som.umaryland.edu>> wrote:
>> Bert,
>> Thank you for your reply. You are correct that your code will print the
>> contents of the data frame. While it works, it is not as elegant as the lm
>> function. One does not have to pass the independent and dependent variables
>> to lm In parentheses.
>>
>> Fit1<-lm(y~x,data=mydata)
>>
>> None of the parameters to lm are passed in quotation marks. Somehow,
>> using deparse(substitute()) and other magic lm is able to get the data in
>> the dataframe mydata. I want to be able to do the same magic in functions I
>> write; pass a dataframe and column names, all without quotation marks and
>> be able to write code that will provide access to the columns of the
>> dataframe without having to pass the column names in quotation marks.
>> Thank you,
>> John
>>
>> John David Sorkin M.D., Ph.D.
>> Professor of Medicine
>> Chief, Biostatistics and Informatics
>> University of Maryland School of Medicine Division of Gerontology and
>> Geriatric Medicine
>> Baltimore VA Medical Center
>> 10 North Greene Street
>> GRECC (BT/18/GR)
>> Baltimore, MD 21201-1524
>> (Phone) 410-605-711<tel:410-605-7119>9
>> (Fax) 410-605-7913<tel:410-605-7913> (Please call phone number above
>> prior to faxing)
>>
>> On May 29, 2019, at 9:59 PM, Bert Gunter <bgunter.4567 using gmail.com<mailto:
>> bgunter.4567 using gmail.com>> wrote:
>>
>> Basically, huh?
>>
>> > df <- data.frame(a = 1:3, b = letters[1:3])
>> > nm <- names(df)
>> > print(df[,nm[1]])
>> [1] 1 2 3
>> > print(df[,nm[2]])
>> [1] a b c
>> Levels: a b c
>>
>> This can be done within a function, of course:
>>
>> > demo <- function(df, colnames){
>> +    print(df[,colnames])
>> + }
>> > demo(df,c("a","b"))
>>   a b
>> 1 1 a
>> 2 2 b
>> 3 3 c
>>
>> Am I missing something? (Apologies, if so).
>>
>> Bert Gunter
>>
>>
>>
>> On Wed, May 29, 2019 at 6:40 PM Sorkin, John <jsorkin using som.umaryland.edu
>> <mailto:jsorkin using som.umaryland.edu>> wrote:
>> Thanks to several kind people, I understand how to use
>> deparse(substitute(paramter)) to get as text strings the arguments passed
>> to an R function. What I still can't do is put the text strings recovered
>> by deparse(substitute(parameter)) back together to get the columns of a
>> dataframe passed to the function. What I want to do is pass a column name
>> to a function along with the name of the dataframe and then, within the
>> function access the column of the dataframe.
>>
>> I want the function below to print the columns of the dataframe testdata,
>> i.e. testdata[,"FSG"] and testdata[,"GCM"]. I have tried several ways to
>> tell the function to print the columns; none of them work.
>>
>> I thank everyone who has helped in the past, and those people who will
>> help me now!
>>
>> John
>>
>> testdata <- structure(list(FSG = c(271L, 288L, 269L, 297L, 311L, 217L,
>> 235L,
>>
>>                                    172L, 201L, 162L), CGM = c(205L, 273L,
>> 226L, 235L, 311L, 201L,
>>
>>                                    203L, 155L, 182L, 163L)), row.names =
>> c(NA, 10L), class = "data.frame")
>>
>> cat("This is the data frame")
>>
>> class(testdata)
>>
>> testdata
>>
>>
>>
>> BAPlot <- function(first,second,indata){
>>
>>   # these lines of code work
>>
>>     col1 <- deparse(substitute(first))
>>
>>     col2 <- deparse(substitute(second))
>>
>>     thedata <- deparse(substitute(third))
>>
>>     print(col1)
>>
>>     print(col2)
>>
>>     print(thedata)
>>
>>     cat("This gets the data, but not as a dataframe\n")
>>
>>     zoop<-paste(indata)
>>
>>     print(zoop)
>>
>>     cat("End This gets the data, but not as a dataframe\n")
>>
>>      # these lines do not work
>>
>>     print(indata[,first])
>>
>>     print(indata[,"first"])
>>
>>     print(thedata[,col1])
>>
>>     paste(zoop[,paste(first)])
>>
>>     paste(zoop[,first])
>>
>>     zap<-paste(first)
>>
>>     print(zap)
>>
>> }
>>
>>
>>
>>
>>         [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help using r-project.org<mailto:R-help using 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.
>>
>>         [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help using 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.
>>
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list