[R] ncol() vs. length() on data.frames

Prof. Dr. Matthias Kohl M@tth|@@@Koh| @end|ng |rom @t@m@t@@de
Tue Mar 31 16:30:53 CEST 2020


should have added: dim(x)[2L] -> length(x)

Am 31.03.20 um 16:21 schrieb Prof. Dr. Matthias Kohl:
> Dear Ivan,
> 
> if I enter ncol in the console, I get
> 
> function (x)
> dim(x)[2L]
> <bytecode: 0x5559e9429030>
> <environment: namespace:base>
> 
> indicating that function dim is called. Function dim has a method for 
> data.frame; see methods("dim").
> 
> The dim-method for data.frame is
> 
> dim.data.frame
> function (x)
> c(.row_names_info(x, 2L), length(x))
> <bytecode: 0x5559eb80da40>
> <environment: namespace:base>
> 
> Hence, it calls length on the provided data.frame. In addition, some 
> "magic" with .row_names_info is performed, where
> 
> base:::.row_names_info
> function (x, type = 1L)
> .Internal(shortRowNames(x, type))
> <bytecode: 0x5559ece50160>
> <environment: namespace:base>
> 
> Best
> Matthias
> 
> Am 31.03.20 um 16:10 schrieb Ivan Calandra:
>> Thanks Ivan for the answer.
>>
>> So it confirms my first thought that these two functions are equivalent
>> when applied to a "simple" data.frame.
>>
>> The reason I was asking is because I have gotten used to use length() in
>> my scripts. It works perfectly and I understand it easily. But to be
>> honest, ncol() is more intuitive to most users (especially the novice)
>> so I was thinking about switching to using this function instead (all my
>> data.frames are created from read.csv() or similar functions so there
>> should not be any issue). But before doing that, I want to be sure that
>> it is not going to create unexpected results.
>>
>> Thank you,
>> Ivan
>>
>> -- 
>> Dr. Ivan Calandra
>> TraCEr, laboratory for Traceology and Controlled Experiments
>> MONREPOS Archaeological Research Centre and
>> Museum for Human Behavioural Evolution
>> Schloss Monrepos
>> 56567 Neuwied, Germany
>> +49 (0) 2631 9772-243
>> https://www.researchgate.net/profile/Ivan_Calandra
>>
>> On 31/03/2020 16:00, Ivan Krylov wrote:
>>> On Tue, 31 Mar 2020 14:47:54 +0200
>>> Ivan Calandra <calandra using rgzm.de> wrote:
>>>
>>>> On a simple data.frame (i.e. each element is a vector), ncol() and
>>>> length() will give the same result.
>>>> Are they just equivalent on such objects, or are they differences in
>>>> some cases?
>>> I am not aware of any exceptions to ncol(dataframe)==length(dataframe)
>>> (in fact, ncol(x) is dim(x)[2L] and ?dim says that dim(dataframe)
>>> returns c(length(attr(dataframe, 'row.names')), length(dataframe))), but
>>> watch out for AsIs columns which can have columns of their own:
>>>
>>> x <- data.frame(I(volcano))
>>> dim(x)
>>> # [1] 87  1
>>> length(x)
>>> # [1] 1
>>> dim(x[,1])
>>> # [1] 87 61
>>>
>>>
>>
>> ______________________________________________
>> 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.
>>
> 

-- 
Prof. Dr. Matthias Kohl
www.stamats.de



More information about the R-help mailing list