[R] is this a bug?

Brian Diggs diggsb at ohsu.edu
Fri Jun 17 23:58:44 CEST 2011


On 6/17/2011 2:24 PM, (Ted Harding) wrote:
> And the extra twist in the tale is exemplified by this
> mini-version of Albert-Jan's first example:
>
>    DF<- data.frame(A=c(1,2,3))
>    DF$B<- c(4,5,6)
>    DF$C<- c(7,8,9)
>    DF
>    #   A B C
>    # 1 1 4 7
>    # 2 2 5 8
>    # 3 3 6 9
>
>    DF$D<- DF["A"]/DF["B"]
>    DF
>    #   A B C    A
>    # 1 1 4 7 0.25
>    # 2 2 5 8 0.40
>    # 3 3 6 9 0.50
>
> ##And why:
>
>    DF["A"]/DF["B"]
>    #      A
>    # 1 0.25
>    # 2 0.40
>    # 3 0.50
>
> ##So the ratio DF["A"]/DF["B"] comes out with the name of
> ##the numerator, "A". This is then the name given to DF$D

It's even slightly weirder than that:

str(DF)
#'data.frame':   3 obs. of  4 variables:
# $ A: num  1 2 3
# $ B: num  4 5 6
# $ C: num  7 8 9
# $ D:'data.frame':      3 obs. of  1 variable:
#  ..$ A: num  0.25 0.4 0.5

There is a column D in DF which is itself a data frame with a single 
column whose name is A (because of what Ted said).  When formatted for 
printing out, the column name of the inner data frame is used (as a 
result of how data.frame() itself handles named arguments when the 
argument is itself a data.frame: "If a list or data frame or matrix is 
passed to data.frame it is as if each component or column had been 
passed as a separate argument...").

So not a bug, but a convoluted set of circumstances that can happen when 
non-atomic vectors are assigned to columns of a data.frame.  That's one 
of those /you shouldn't do that even though it is technically legal or 
at least you shouldn't be surprised when things don't work the way you 
thought they would/ things.

> Thus Albert-Jan's
>    df["weight"] / ave(df["weight"], df["sex"], FUN=sum)*100
> comes through with name "weight".
>
> Ted.
>
>
> On 17-Jun-11 21:06:42, William Dunlap wrote:
>> df$varname is a column of df.
>>
>> df["varname"] is a one-column df containing that column.
>>
>> df[["varname"]] is a column of df (same as df$varname).
>>
>> df[,"varname"] is a column of df (same as df$varname).
>>
>> df[,"varname",drop=FALSE] is a one-column df (same as df$varname).
>>
>> df$newVarname<- df["varname"] inserts a new component
>> into df, the component being a one-column data.frame,
>> not the column in that data.frame.
>>
>> Bill Dunlap
>> Spotfire, TIBCO Software
>> wdunlap tibco.com
>>
>>> -----Original Message-----
>>> From: r-help-bounces at r-project.org
>>> [mailto:r-help-bounces at r-project.org] On Behalf Of Albert-Jan Roskam
>>> Sent: Friday, June 17, 2011 1:49 PM
>>> To: R Mailing List
>>> Subject: [R] is this a bug?
>>>
>>> Hello,
>>>
>>> Is the following a bug? I always thought that df$varname<-
>>> does the same as
>>> df["varname"]<-
>>>
>>>> df<- data.frame(weight=round(runif(10, 10, 100)),
>>> sex=round(runif(100, 0,
>>> 1)))
>>>> df$pct<- df["weight"] / ave(df["weight"], df["sex"], FUN=sum)*100
>>>> names(df)
>>> [1] "weight" "sex"    "pct"     ### ---------->  ok
>>>> head(df)
>>>    weight sex    weight  ### ---------->  huh!?!
>>> 1     86   0 2.4002233
>>> 2     19   1 0.5643006
>>> 3     32   0 0.8931063
>>> 4     87   0 2.4281328
>>> 5     45   0 1.2559308
>>> 6     95   0 2.6514094
>>>> rm(df)
>>>> df<- data.frame(weight=round(runif(10, 10, 100)),
>>> sex=round(runif(100, 0,
>>> 1)))
>>>> df["pct"]<- df["weight"] / ave(df["weight"], df["sex"],
>>> FUN=sum)*100 ###
>>>> ----->  this does work
>>>> names(df)
>>> [1] "weight" "sex"    "pct"
>>>> head(df)
>>>    weight sex       pct
>>> 1     15   0 0.5246590
>>> 2     43   0 1.5040224
>>> 3     17   1 0.9284544
>>> 4     44   1 2.4030584
>>> 5     76   1 4.1507373
>>> 6     59   0 2.0636586
>>>> do.call(c, R.Version())
>>>                         platform                            arch
>>>              "i686-pc-linux-gnu"                          "i686"
>>>                               os                          system
>>>                      "linux-gnu"               "i686, linux-gnu"
>>>                           status                           major
>>>                               ""                             "2"
>>>                            minor                            year
>>>                           "11.1"                          "2010"
>>>                            month                             day
>>>                             "05"                            "31"
>>>                          svn rev                        language
>>>                          "52157"                             "R"
>>>                   version.string
>>> "R version 2.11.1 (2010-05-31)"
>>>> # Thanks!
>>>
>>> Cheers!!
>>> Albert-Jan
>>>
>>>
>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> All right, but apart from the sanitation, the medicine,
>>> education, wine, public
>>> order, irrigation, roads, a fresh water system, and public
>>> health, what have the
>>> Romans ever done for us?
>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>
>>>       [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> 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.
>>>
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> 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.
>
> --------------------------------------------------------------------
> E-Mail: (Ted Harding)<ted.harding at wlandres.net>
> Fax-to-email: +44 (0)870 094 0861
> Date: 17-Jun-11                                       Time: 22:24:41
> ------------------------------ XFMail ------------------------------
>


-- 
Brian S. Diggs, PhD
Senior Research Associate, Department of Surgery
Oregon Health & Science University



More information about the R-help mailing list