如何从数据框的列中获取函数的输出 - R

时间:2016-10-11 07:35:44

标签: r function

嗨,我有一个简单的功能:

same_picking <- function(cena){
  data_model2$price_model2 <- 0.6 + cena * data_model2$item_SKU + 0.4
}

我希望输出在data.frame的一列中重写。

目前,因为我仍然没有得到函数的第一次写入,所以列仍然充满了NA ..但是我希望在每次运行函数之后,值将被重写在theat列中。

count_code  sifra   item_SKU    price_model2
281         0421    2           NA
683         0499    5           NA
903         0654    3           NA
7390        0942    3           NA
2778        0796    5           NA
2778        0796    7           NA
7066        0907    83          NA
281         0421    2           NA

我已经尝试过使用命令:data.frame和......但它让我无处可去。

我会帮助你。 Andraz

解决方案

same_picking <- function(cena){
      data_model2$price_model2 <<- 0.6 + cena * data_model2$item_SKU + 0.4
}

&lt;&lt; - 运算符允许您从外部访问对象。很干净:))

1 个答案:

答案 0 :(得分:1)

最简单的方法是从函数返回df:

df <- read.table(
  text = "count_code  sifra   item_SKU    price_model2
          281         0421    2           NA
          683         0499    5           NA
          903         0654    3           NA
          7390        0942    3           NA
          2778        0796    5           NA
          2778        0796    7           NA
          7066        0907    83          NA
          281         0421    2           NA",
  header = TRUE)

head(df, 2)
#   count_code sifra item_SKU price_model2
# 1        281   421        2           NA
# 2        683   499        5           NA

# 1st ---------------------------------------------------------------------

same_picking_1 <- function(df, cena){
  df$price_model2 <- 0.6 + cena * df$item_SKU + 0.4
  return(df)
}

df2 <- same_picking_1(df, 1)

head(df2, 2)
#   count_code sifra item_SKU price_model2
# 1        281   421        2            3
# 2        683   499        5            6

其他选项,data.tabledplyr

same_picking_2 <- function(cena, item_SKU){
  0.6 + cena * df$item_SKU + 0.4
}

# data.table --------------------------------------------------------------

library(data.table)
dt <- data.table(df)
dt[, price_model2 := same_picking_2(1, item_SKU)]

head(dt, 2)
#    count_code sifra item_SKU price_model2
# 1:        281   421        2            3
# 2:        683   499        5            6

# dplyr -------------------------------------------------------------------

library(dplyr)
df3 <- df %>% mutate(price_model2 = same_picking_2(1, item_SKU))

head(df3, 2)
#   count_code sifra item_SKU price_model2
# 1        281   421        2            3
# 2        683   499        5            6

OP评论后编辑:

您还可以将data.table解决方案包装到函数

# data.table --------------------------------------------------------------

library(data.table)

same_picking_2_int <- function(cena, item_SKU){
  0.6 + cena * df$item_SKU + 0.4
}

same_picking_2 <- function(dt, cena){
  dt[, price_model2 := same_picking_2_int(cena, item_SKU)]
}

# Use update by reference
dt <- data.table(df)
head(dt, 2)
same_picking_2(dt, 1)
head(dt, 2)

# Slightly more readable, the same output, also utilizes the update by reference of data.table (see tracemem())
dt <- data.table(df)
tracemem(dt)
head(dt, 2)
dt <- same_picking_2(dt, 1)
head(dt, 2)