2017-02-21 31 views
0

Прежде всего, спасибо, кто когда-либо задает этот вопрос. У меня есть до десяти кадров данных, которые я хочу применить к функции pct (из пакета caroline). Из-за данных, которые у меня есть, что вызывает ошибку переполнения, я должен разделить все ячейки на 1000. Как только это произойдет, я могу применить функцию pct без проблем. Затем я хочу обрезать исходные данные и создать новый фрейм данных.Примените функцию pct к нескольким информационным кадрам

Мне удалось написать следующую функцию, которая делает правильную вещь, за исключением того, что она не сохраняет результаты (возможно, она не имеет оператора возврата). Поэтому я мог бы сделать это долго. Однако это не самое главное.

require (pct) 
finallist <- list(A, B) 

lapply(finallist , function (foo) { 

temp <- as.data.frame(foo[,1]) 
checks <- cbind(temp, foo[,2:480]/1000) 
checka <- pct(checks, tickerlist) 
foo <- checka[c(1, 481:959)] 
}) 

С А и В данных кадров формируется как этот

A <- structure(list(mgrname = c("Man A", "Man A", "Man A", "Man B", "Man B", "Man B", "Man C", "Man C", "Man C"), 
        ticker = c("AAPL", "MSFT", "TLSA", "AAPL", "MSFT", "TLSA", "AAPL", "MSFT", "TLSA"), 
        share = c(20L, 30L, 40L, 20L, 10L, 50L, 20L, 20L, 80L)), 
      .Names = c("mgrname", "ticker", "share"), 
      row.names = c(NA, -9L), 
      class = "data.frame") 

B будет же

Реальный ключ, чтобы попытаться записать новые данные кадры из. Код, который я начал с использует невидимую функцию (я думаю, что она должна иметь присвойте функцию где-то там)

invisible(lapply (names(finalist), 
       function (foo) assign (x = y, value = temp <-  as.data.frame(foo[,1]), 
       checks <- cbind(temp, foo[,2:480]/1000), 
       checka <- pct(checks, tickerlist), 
       foo <- checka[c(1, 481:959)] , envir =.GlobalEnv))) 

Но это говорит

Error in lapply(names(finalist), function(foo) assign(x = y, value = temp <- as.data.frame(foo[, : 
    object 'finalist' not found 

Окончательный кадр данных следует надеяться выглядеть

| mgrname | APPL | MSFT | TLSA | 
    |---------|--------|-------|-------| 
    | Man A | .33 | .5 | .23 | 
    | Man B | .33 | .16 | .30 | 
    | Man C | .33 | .33 | .47 | 
+0

Похоже, вы определяете объект 'finallist' с двумя' l 's, но затем в вашем' lapply' вы используете 'финалист' только с одним' l'. Поскольку вы никогда не определяли 'финалист' с одним' l', вы получаете объект, который не найден. – Gregor

+0

У вас есть хорошая идея со списком кадров данных, я не знаю, почему вы обманываете себя с помощью 'assign' внутри вашего' lapply' - продолжайте использовать списки. Аргумент 'x = y' для' assign' особенно странный, поскольку 'y', похоже, не меняется. Кроме того, вам не хватает фигурных скобок? Кажется, вы даете 'assign' очень много аргументов,' x = y', 'value = temp <- ...', 'checks <- ...'. Обычно считается неправильной формой (и ненужной) для использования '<-' в аргументе функции ... – Gregor

+0

Когда вы выполняете' function (foo) ',' foo' - это имя ввода функции, вы, кажется, используя его как выход. Я думаю, что ваш пример несколько затенен, используя идентичные входы 'A' и' B'. Если ваши кадры данных имеют одинаковую структуру, вам, вероятно, лучше будет объединить их в один фрейм данных и использовать 'dplyr' или' data.table' для работы с ним по группам. – Gregor

ответ

0

Я нашел, что этот код работал.

Сначала делают манипуляции

newlist <- lapply(finallist , function (foo) { 
temp <- as.data.frame(foo[,1]) 
checks <- cbind(temp, foo[,2:4]/100) 
checka <- pct(checks, c("AAPL", "MSFT", "TLSA")) 
foo <- checka[c(1, 5:7)] 
}) 

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

lapply(seq_along(newlist), 
    function(i,x) {assign(paste0("a",i),x[[i]], envir=.GlobalEnv)}, 
    x=newlist) 

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

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