跨多个数据框应用 pct 函数
Apply pct function across multiple dataframes
首先感谢提出这个问题的人。我最多有十个数据框要应用 pct 函数(来自 caroline 包)。由于我拥有的数据会导致溢出错误,我必须将所有单元格除以 1000。一旦发生这种情况,我就可以毫无问题地应用 pct 函数。然后我想 trim 关闭原始数据并创建一个新的数据框。
我已经设法编写了以下函数,除了它不保存结果(可能缺少 return 语句)之外,它做了正确的事情。因此我可以长手完成。然而,这还不是最重要的。
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")
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 |
我发现这段代码有效。
先做操作
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)
首先感谢提出这个问题的人。我最多有十个数据框要应用 pct 函数(来自 caroline 包)。由于我拥有的数据会导致溢出错误,我必须将所有单元格除以 1000。一旦发生这种情况,我就可以毫无问题地应用 pct 函数。然后我想 trim 关闭原始数据并创建一个新的数据框。
我已经设法编写了以下函数,除了它不保存结果(可能缺少 return 语句)之外,它做了正确的事情。因此我可以长手完成。然而,这还不是最重要的。
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")
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 |
我发现这段代码有效。
先做操作
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)