[R] fill 0-row data.frame with 1 line of NAs

Brian Diggs diggsb at ohsu.edu
Tue Jul 10 17:50:56 CEST 2012


On 7/10/2012 7:53 AM, Peter Ehlers wrote:
> On 2012-07-10 06:57, Rui Barradas wrote:
>> Hello,
>>
>> If you write a function, it becomes less convoluted...
>>
>>
>> empty <- function(x){
>>     if(NROW(x) == 0){
>>         y <- rep(NA, NCOL(x))
>>         names(y) <- names(x)
>>         y
>>     }else x
>> }
>>
>> (.xb <- iris[ iris$Species=='zz', ])
>> empty(.xb)
>
> Both this and Liviu's original solution destroy the
> factor nature of 'Species' (which may not matter, of
> course). How about
>
>    (.xb <- iris[ iris$Species=='zz', ])
>    .xb <- .xb[1, ]   # this probably shouldn't work, but it does.

Using NA subscripting seems even better

empty <- function(x) {
   if(NROW(x) == 0) {
     x[NA,]
   } else {
     x
   }
}

It even preserves the factor nature of things:

 > empty(iris[iris$Specis=='zz',])
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
NA           NA          NA           NA          NA    <NA>
 > str(empty(iris[iris$Specis=='zz',]))
'data.frame':   1 obs. of  5 variables:
  $ Sepal.Length: num NA
  $ Sepal.Width : num NA
  $ Petal.Length: num NA
  $ Petal.Width : num NA
  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: NA


> ?
>
> Peter Ehlers
>
>>
>>
>> Hope this helps,
>>
>> Rui Barradas
>>
>> Em 10-07-2012 14:15, Liviu Andronic escreveu:
>>> Dear all
>>> Is there a simpler method to achieve the following: When I obtain an
>>> empty data.frame after subsetting, I need for it to contain one line
>>> of NAs. Here's a dummy example:
>>>> (.xb <- iris[ iris$Species=='zz', ])
>>> [1] Sepal.Length Sepal.Width  Petal.Length Petal.Width  Species
>>> <0 rows> (or 0-length row.names)
>>>> dim(.xb)
>>> [1] 0 5
>>>> (.xa <- data.frame(matrix(rep(NA, ncol(.xb)), 1)))
>>>     X1 X2 X3 X4 X5
>>> 1 NA NA NA NA NA
>>>> names(.xa) <- names(.xb)
>>>> (.xb <- .xa)
>>>     Sepal.Length Sepal.Width Petal.Length Petal.Width Species
>>> 1           NA          NA           NA          NA      NA
>>>
>>>
>>> The solution I came up with is way too convoluted. Anything simpler?
>>> Regards
>>> Liviu
>>>
>>>
>>
>> ______________________________________________
>> 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.
>>
>


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



More information about the R-help mailing list