2016-12-02 1 views
1

я могу добавить столбцы data.frame:Как добавить несколько пустых столбцов в data.frame с 0 строками?

x <- head(iris) 
y <- x[1:nrow(x) > 7, ] 
x[c('NewCol1', 'NewCol2')] <- rep(c('a', 'b'), each = nrow(x)) 

Для data.frame с 0 строки, она не работает:

# > y 
# [1] Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
# <0 rows> (or 0-length row.names) 

y[c('NewCol1', 'NewCol2')] <- rep(c('a', 'b'), each = nrow(y)) 

# Error in value[[jvseq[[jjj]]]] : subscript out of bounds 

Я нашел это, Add Columns to an empty data frame in R, но это не делает помогите много.

ожидается выход:

# > y 
# [1] Sepal.Length Sepal.Width Petal.Length Petal.Width Species  NewCol1  NewCol2 
# <0 rows> (or 0-length row.names) 
+0

Я не вижу, как 'y' квалифицируется как пустой кадр данных. У него есть содержимое. Можете ли вы рассказать о том, что вы пытаетесь сделать здесь? –

+1

@TimBiegeleisen, извините за это. Я редактировал вопрос. – mt1022

+0

Итак, у вас есть 'x' как dataframe из 6 строк. Каков ваш ожидаемый результат? –

ответ

2

Рассмотрим следующий код, который создает пустой фрейм данных:

df <- data.frame(Ints=integer(), 
       Characters=character(), 
       stringsAsFactors=FALSE) 

Один из способов, чтобы добавить новый столбец в этой пустой кадр данных является использование cbind():

df2 <- cbind(df, data.frame(Stuff=character(),stringsAsFactors=FALSE)) 

> df2 
[1] Ints  Characters Stuff  
<0 rows> (or 0-length row.names) 

Затем просто добавьте свои данные, как обычно, e .г.

> df2[1,] <- c(1, "hello", "world") 
> df2 
    Ints Characters Stuff 
1 1  hello world 

Как уже упоминалось, это может вызвать проблемы литья в Ints колонке. Назначение каждого столбца само по себе позволяет избежать этого, например.

df2$Ints <- c(1:5) 
df2$Stuff <- c("one", "two", "three", "four", "five") 

Или вы могли бы использовать что-то вроде read.table, чтобы принести в ваших данных, и явно назначить классы таким образом.

+0

Это работает. но 'f2 [1,] <- c (1," hello "," world ") 'изменил Ints col на символ! – mt1022

+0

В любом случае, то, что я хочу сделать дальше, это rbind data.frames, сгенерированные lapply (некоторые пустые). Это имеет значение. – mt1022

2

Мы можем использовать read.table установкой col.names параметра

read.table(text = "",col.names = c(names(y), c("New_Col1", "New_Col2"))) 

#Sepal.Length Sepal.Width Petal.Length Petal.Width Specie New_Col1 New_Col2 
#<0 rows> (or 0-length row.names) 

Мы также можем установить наш желаемый класс с помощью параметра colClasses

read.table(text = "",col.names = c(names(y), c("New_Col1", "New_Col2")), 
       colClasses = c(sapply(y, class), "character", "character")) 

Так что в этом случае две новые переменные получат character класс ,

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