2015-03-03 5 views
1

Извините, если это основной вопрос. Я новичок. Любые направления очень ценятся.создавать и заполнять столбцы в dataframe в R

У меня df1, как показано ниже (POSIXct) (135 строк)

> head(df1) 
    uniqueSessionsIni uniqueSessionsEnd 
1 2015-01-05 15:00:00 2015-01-05 15:59:00 
2 2015-01-05 15:00:00 2015-01-05 15:59:00 
3 2015-01-05 15:00:00 2015-01-05 15:59:00 

вектор имена - с именами для новых 600 столбцов, как показано ниже.

> head(names) 
[1] "m0p0" "m1p0" "m2p0" "m3p0" "m4p0" "m5p0"... 

и

> head(allPairs) 
    Var1 Var2 names 
1 1 0 m1p0 
2 1 1 m1p1 

Я хочу, чтобы заполнить все строки df1, столбцы 4 до 603 со значениями на основе: вектор имена - названия для новых 600 столбцов, как показано ниже. uniqueSessionsIni Var1 + Var2.
Вы заметите, что Var1 соответствует цифре после «m» в столбце. имена, а Var2 соответствует цифре после «p» в именах.

Результат будет примерно таким (но с большим количеством столбцов).

> head(df1) 
    uniqueSessionsIni uniqueSessionsEnd   m1p0     m1p1  
1 2015-01-05 15:00:00 2015-01-05 15:59:00 2015-01-05 15:01:00 2015-01-05 15:02:00 
2 2015-01-05 16:00:00 2015-01-05 15:59:00 2015-01-05 16:01:00 2015-01-05 16:02:00 
3 2015-01-05 17:00:00 2015-01-05 15:59:00 2015-01-05 17:01:00 2015-01-05 17:02:00 

Я попытался следующий код, чтобы создать новые столбцы в df1:

df1[,names] <- NA 

Это успешно создает новые столбцы и заполнит с НС

Так что я пытаюсь создать условие с петлей для заполнения этих новых колонок (от 3 до 603) с кодом

df1[,names] <- for (i in df1$timestamps) 
df1$uniqueSessionsIni + (as.posix(allPairs$Var1) + (as.posix(allPairs$Var2) 

Но R отвечает так, как если бы выражение было неполным (+). Это вопрос синтаксической ошибки? Или мне нужно другое решение, чтобы заполнить новые столбцы?
Спасибо заранее.

+0

Это не ясно. Кажется, вам нужен только один столбец, как вы это говорите. Вам нужно сделать свой пример воспроизводимым, то есть предоставить некоторые реальные данные и показать нам, что вы хотите, чтобы результат был (за меньшие столбцы, чем 603). – LyzandeR

+0

В R, создающем и заполняющем столбец data.frame, обычно должен быть один шаг. Кроме того, R чувствителен к регистру, и круглые скобки должны совпадать. Изучите документацию о функциях, которые вы хотите использовать, и воспользуйтесь векторизацией (использование циклов 'for' должно быть исключением в вашей повседневной работе). – Roland

+0

Благодарим вас за отзыв. Я отредактировал, как предложил @LyzandeR. – jpinelo

ответ

1

Вы можете попробовать это:

данных:

df1 <- data.frame(uniqueSessionsIni=as.POSIXlt(c('2015-01-05 15:00:00','2015-01-05 16:00:00', '2015-01-05 17:00:00 ')), 
        uniqueSessionsIni=as.POSIXlt(c('2015-01-05 15:59:00','2015-01-05 16:59:00', '2015-01-05 17:59:00 '))) 

#note that the names column below should be of character class and not factor 
allPairs <- data.frame(Var1=c(1,1), Var2=c(0,1), names=c('m1p0','m1p1'),stringsAsFactors=F) 

Решение:

#the list below creates the columns you need 
mylist <- list() 
for (i in 1:nrow(allPairs)){ 
    mylist[[allPairs[i, 3]]] <- df1$uniqueSessionsIni + 60*as.numeric(allPairs[i, 1]) + 60*as.numeric(allPairs[i, 2]) 
} 

> mylist 
$m1p0 
[1] "2015-01-05 15:01:00 GMT" "2015-01-05 16:01:00 GMT" "2015-01-05 17:01:00 GMT" 

$m1p1 
[1] "2015-01-05 15:02:00 GMT" "2015-01-05 16:02:00 GMT" "2015-01-05 17:02:00 GMT" 
#cbind all df1 and the new column from the loop 
cbind(df1, data.frame(mylist)) 

Выход:

> cbind(df1, data.frame(mylist)) 
    uniqueSessionsIni uniqueSessionsIni.1    m1p0    m1p1 
1 2015-01-05 15:00:00 2015-01-05 15:59:00 2015-01-05 15:01:00 2015-01-05 15:02:00 
2 2015-01-05 16:00:00 2015-01-05 16:59:00 2015-01-05 16:01:00 2015-01-05 16:02:00 
3 2015-01-05 17:00:00 2015-01-05 17:59:00 2015-01-05 17:01:00 2015-01-05 17:02:00 
+0

@ LyzanderR. Ваше решение работает. Огромное спасибо. – jpinelo

+0

Добро пожаловать :). Я сделал небольшую ошибку, создав неправильные данные. Я исправил это сейчас. С удовольствием помогли :) !! – LyzandeR

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

  • Нет связанных вопросов^_^