[Rd] Assignment of individual values to data frame columns: intentional or unintentional behavior?

Peter Ehlers ehlers at ucalgary.ca
Thu Sep 2 16:45:06 CEST 2010


On 2010-08-05 12:14, Ulrike Grömping wrote:
> Gabor Grothendieck schrieb:
>> On Thu, Aug 5, 2010 at 12:24 PM, Ulrike Grömping
>> <groemping at bht-berlin.de>  wrote:
>>
>>> Dear developeRs,
>>>
>>> I have just discovered a strange feature when assigning some values to
>>> columns of a data frame: The column is matched by partial matching (as
>>> documented), but when assigning a value, a new column with the partial name
>>> is added to the data frame that is identical to the original column except
>>> for the changed value. Is that intentional ? An example:
>>>
>>
>> Note that the lack of partial matching when performing assignment is
>> also documented.
>>
>> See second last paragraph in Details section of ?Extract
>>
> Yes, I see, thanks. I looked at ?"[.data.frame", where this is not
> documented.
>
> However, given the documentation that partial matching is not used on
> the left-hand side, I would have expected even more that the assignment
>
> sw$Fert[1]<- 10
>
> works differently, because I am using it on the left-hand side.
> Probably, extraction ([1]) is done first here, so that the right-hand
> side won. At least, this is very confusing.
>
> Best, Ulrike

This is another example of why it's a good idea to avoid
the '$' notation when fiddling with data frames. Try this:

  sw <- swiss[1:5, 1:4]
  sw[["Fert"]]
  sw[["Fert"]] <- 10

and my preferred version:
  sw[, "Fert"]
  sw[, "Fert"] <- 10

I've never liked partial matching for data frames.

   -Peter Ehlers



More information about the R-devel mailing list