2016-10-03 3 views
0

Я хочу, чтобы инициализировать столбец в data.frame выглядеть так:Добавить столбец пустой data.frame

df$newCol = 1 

где ДФ является data.frame, что я определил ранее и уже сделали некоторую обработку , Пока nrow (DF)> 0, то это не проблема, но иногда моя data.frame имеет длину строки 0 и я получаю:

> df$newCol = 1 
Error in `[[<-`(`*tmp*`, name, value = 1) : 
1 elements in value to replace 0 elements 

я могу обойти эту проблему, изменив свою первоначальную строку

df$newCol = rep(1,nrow(df)) 

но это кажется немного неуклюжим и является вычислительно запретительным, если число строк в df велико. Есть ли встроенное или стандартное решение этой проблемы? Или я должен использовать некоторые пользовательские функции, как так

addCol = function(df,name,value) { 
    if(nrow(df)==0){ 
    df[,name] = rep(value,0) 
    }else{ 
    df[,name] = value 
    } 
    df 
} 

ответ

5

Если я правильно понимаю,

df = mtcars[0, ] 
df$newCol = numeric(nrow(df)) 

должно быть это?

Это при условии, что «длина строки» вы имеете в виду nrows, в этом случае вам нужно добавить вектор длины 0. В таком случае, numeric(nrow(df)) даст вам тот же результат, как и rep(0, nrow(df)).

Он также предполагает, что вам нужен только новый столбец, а не конкретный столбец из них - тогда вы просто сделаете +1, который является векторизованной операцией и поэтому быстро.

Кроме этого, я не уверен, что у вас может быть «пустой» столбец - вектор должен иметь такое же количество элементов, как и другие векторы в кадре данных. Но numeric быстро, это не должно повредить.

Смежные вопросы