嗨,我有一个简单的功能:
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; - 运算符允许您从外部访问对象。很干净:))
答案 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.table
和dplyr
:
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
您还可以将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)