我想知道这可能是一个范围问题。我是R的新手,我正在尝试在一系列列上使用函数并将结果输出到新的数据框。该函数应将结果添加到新行中。
以下是代码的简化版本。目前,该功能不会将任何数据添加到输出数据帧(“pinecone”)。谁能告诉我为什么这不起作用?非常感谢提前!
## create random data frame
honeybadger <- data.frame(alpha = sample(20:35,100, replace=T),
beta = sample(1:35,100, replace=T),
gamma = sample(200:301,100, replace=T),
delta = sample(40:100,100, replace=T),
epsilon = sample(10:45,100, replace=T))
## create empty data frame for results
pinecone <- data.frame("col_A" = numeric(),
"col_B" = numeric(),
"col_C" = numeric(),
"col_D" = numeric())
## define function to analyze data and add to results data frame
funkytown <- function(greek,rand_int) {
parameter <- deparse(substitute(greek))
pinecone[parameter,] <- list("col_A" = mean(greek),
"col_B" = rand_int+3,
"col_C" = sd(greek),
"col_D" = rand_int)
}
## run function on data columns
funkytown(honeybadger$alpha,2)
funkytown(honeybadger$beta,5)
funkytown(honeybadger$gamma,4)
funkytown(honeybadger$delta,1)
funkytown(honeybadger$epsilon,9)
答案 0 :(得分:1)
我不太清楚你的目标是什么。也许这个:
set.seed(42)
honeybadger <- data.frame(alpha = sample(20:35,100, replace=T),
beta = sample(1:35,100, replace=T),
gamma = sample(200:301,100, replace=T),
delta = sample(40:100,100, replace=T),
epsilon = sample(10:45,100, replace=T))
numbers <- sample.int(20, 5)
t(mapply(function(x,y) data.frame(
col_A=mean(x),
col_B = y+3,
col_C = sd(x),
col_D = y
), honeybadger, numbers))
# col_A col_B col_C col_D
#alpha 27.92 6 4.751778 3
#beta 18.69 7 9.91244 4
#gamma 244.5 13 29.22138 10
#delta 70.19 17 18.09609 14
#epsilon 26.08 5 10.5569 2
答案 1 :(得分:1)
你有点不对劲。
在R中创建一个空的数据框然后填充它是一个非常糟糕的设计模式。对于非常少量的行,它可能不是一个大问题,但这不会扩展。每次添加行时,R都被强制复制整个数据帧。这将变得非常慢。
通常,修改在函数外部定义的对象(例如pinecone
正在funkytown
内修改),这与我们在R中通常不同,这与其他语言不同。如果要修改某些内容,请将其作为参数传递(即pinecone
),然后返回并捕获返回值。 (你可以使用<<-
或assign
来做,但是你会在路上抱歉。)
deparse(substitute(greek))
显然不符合您的想法。它会生成一个字符"honeybadger$alpha"
。
请参阅Roland的答案,了解更多R-ish方法,以达到最终目标。