2015-02-17 2 views
-1

Я создал пустой фрейм данных с именами столбцов и пытался вставить строки, содержащие строку и число. Это мой код, однако я не получаю ожидаемого результата.rbind не дает ожидаемого вывода в r

df <- data.frame(col1=character(), col2=numeric(), stringsAsFactors=FALSE) 
for(i in 1:10) 
{ 
    entry = c("hello",i) 
    df = rbind(df,entry) 
} 

EDIT: rbind линия изначально выглядела так, testdf = rbind (ДФ, запись). Спасибо Pascal за то, что вы указали, отредактировав это, так как это была опечатка.

EDIT-TWO: Я попытался сделать на основе предложения Грегора создать столбцы первым, и они свяжут их вместе. Но как я могу гарантировать, что имена столбцов остаются как firstcol и secondcol и не изменяются на col1 и col2?

df <- data.frame(col1=character(), col2=numeric(), stringsAsFactors=FALSE) 
firstcol = NULL 
secondcol = NULL 

for(i in 1:10) 
{ 
    col1 = c(col1,"hello") 
    col2 = c(col2,i) 
} 
+4

Вы переписываете 'testdf' на каждой итерации. И вы ничего не добавляете к 'df'. И 'entry' - это не то, что вы думаете. –

+4

, и у вас не будет столбца 'numeric', потому что когда вы делаете' entry = c («hello», i) ',' i' автоматически преобразуется в 'character' – Cath

+2

С помощью цикла' for' вы всегда должны попробуйте отладить, запустив каждую строку и посмотрев, что к чему. Поэтому инициализируйте 'df', затем в консоли введите' i = 1', затем запустите 'entry = c (« hello », i)», затем введите 'entry' в своей консоли. Это то, что вы хотите? И так далее. – Gregor

ответ

2

это не ответ на пути эффективного построения data.frame, это просто «исправить» ваш цикл таким образом, вы получите то, что вы хотите:

вам можно сделать:

df <- data.frame(col1=character(), col2=numeric(), stringsAsFactors=FALSE) 
for(i in 1:10) 
{ 
    entry = data.frame(col1="hello",col2=i,stringsAsFactors=F) 
    df = rbind(df,entry) 
} 

и вы получите:

head(df) 
# col1 col2 
#1 hello 1 
#2 hello 2 
#3 hello 3 
#4 hello 4 
#5 hello 5 
#6 hello 6 

Однако, в зависимости от того, что вы хотите сделать, вы можете, как и @Gregor предложил:

  • создать col1 и col2 раздельно, а затем либо cbind их или создать свой data.frame с df <- data.frame(col1=col1, col2=col2, stringsAsFactors=F)
  • создайте свой data.frame с требуемыми размерами с df <- data.frame(matrix(, nrow=10, ncol=2, dimnames=list(NULL, paste0("col", 1:2))),stringsAsFactors=F) и заполните его так, как вы хотите впоследствии (например, в петле).
+0

спасибо за ответ. Как я уже сказал в более раннем комментарии, я попытался сделать это с использованием первой точки, которую вы указали выше, т. Е. Создать col1 и col2 в отдельности, а затем либо cbind их. Но как я не могу потерять имена столбцов. Пожалуйста, см. EDIT-TWO – IAMTubby

+1

@IAMTubby, лучший способ ИМО, после того, как вы создали 2 столбца, чтобы создать ваш 'df' с линией кода, которую я поставил в конце моей первой точки:' df <- data. frame (col1 = col1, col2 = col2, strAsAsFactors = F) '(конечно, не нужно создавать свой файл data.frame перед созданием столбцов) – Cath

+1

спасибо, что работает :) – IAMTubby

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