Применить функцию pct к нескольким фреймам данных
Прежде всего, спасибо, кто когда-либо поднимает этот вопрос. У меня есть до десяти фреймов данных, к которым я хочу применить функцию pct (из пакета caroline). Из-за данных, которые у меня есть, что вызывает ошибку переполнения, я должен разделить все ячейки на 1000. Как только это произойдет, я могу применить функцию 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 и B, формируемыми так
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")
Б будет такой же
Реальный ключ состоит в том, чтобы попытаться написать новые кадры данных. Код, с которого я начал, использует невидимую функцию (я думаю, что где-то там должна быть функция assign)
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 |
1 ответ
Я обнаружил, что этот код работает.
Сначала сделайте манипуляции
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)]
})
Тогда используйте это. Namings и т. Д. Немного не в порядке, но я думаю, что справлюсь.
lapply(seq_along(newlist),
function(i,x) {assign(paste0("a",i),x[[i]], envir=.GlobalEnv)},
x=newlist)