Добавить новый столбец к нескольким фреймам данных, используя цикл for - PullRequest
0 голосов
/ 06 марта 2020

У меня есть приведенный ниже кадр данных:

library lubridate

eventtime<-c("2020-02-07 22:06:00","2020-02-07 22:00:00","2020-02-07 21:46:00")
eventvalue<-c("home","work",'exit')
geof<-data.frame(eventtime,eventvalue)

Затем я собираю все его уникальные eventvalue значения в новое.

geoun<-data.frame(unique(geof$eventvalue))

Я создаю новые кадры данных, по одному для каждого уникального eventvalue

#Create dataframes according to eventvalue
for(i in 1:nrow(geoun)){
  assign(paste0(geoun[i,1]), data.frame(geof[ which(geof$eventvalue==geoun[i,1]), ]))

}

Затем я хочу повторить процесс ниже - добавление нового столбца - для каждого, используя для l oop.

#extract just the hour maker, so we can count by hour
home$EventHour <- hour(home$eventtime)

Я использую:

#Create dataframes according to eventvalue
for(i in 1:nrow(geoun)){
  assign(paste0(geoun[i,1]), data.frame(geof[ which(geof$eventvalue==geoun[i,1]), ])$EventHour)<- hour(assign(paste0(geoun[i,1]), data.frame(geof[ which(geof$eventvalue==geoun[i,1]), ]))$eventtime)

}

но я получаю:

Error in assign(paste0(geoun[i, 1]), data.frame(geof[which(geof$eventvalue ==  : 
  could not find function "assign<-"

Как мне этого добиться. В чем моя ошибка?

1 Ответ

1 голос
/ 06 марта 2020

Проще было бы использовать список вместо назначения различных data.frames. Я думаю, что-то вроде этого даст тот же ответ:

library(lubridate)
library(tidyverse)

list1 <- geof %>%
  split(.$eventvalue) %>%
  bind_rows() %>%
  mutate(EventHour = hour(eventtime)) %>%
  split(.$eventvalue)

Редактировать:

Вы можете назначить элементы списка для различных фреймов данных, используя:

for (i in names(list1)) setNames(assign(i, data.frame(list1[[i]])), names(list1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...