使用函数向数据框添加行的范围问题?

时间:2014-03-21 16:03:39

标签: r function scoping

我想知道这可能是一个范围问题。我是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)

2 个答案:

答案 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)

你有点不对劲。

  1. 在R中创建一个空的数据框然后填充它是一个非常糟糕的设计模式。对于非常少量的行,它可能不是一个大问题,但这不会扩展。每次添加行时,R都被强制复制整个数据帧。这将变得非常慢。

  2. 通常,修改在函数外部定义的对象(例如pinecone正在funkytown内修改),这与我们在R中通常不同,这与其他语言不同。如果要修改某些内容,请将其作为参数传递(即pinecone),然后返回并捕获返回值。 (你可以使用<<-assign来做,但是你会在路上抱歉。)

  3. deparse(substitute(greek))显然不符合您的想法。它会生成一个字符"honeybadger$alpha"

  4. 请参阅Roland的答案,了解更多R-ish方法,以达到最终目标。