2017-08-04 3 views
0

私はいくつかのシナリオ分析をしようとしているデータフレームを持っています。私は現在やっているRデータフレームを摂動するための速い方法

Revenue  Item_1 Item_2 Item_3 
552   201  220  45 
1500   401  300  200 
2300   601  400  300 

552   200  221  45 
1500   400  301  200 
2300   600  401  300 

552   200  220  46 
1500   400  300  201 
2300   600  400  301 

Revenue  Item_1 Item_2 Item_3 
552   200  220  45 
1500   400  300  200 
2300   600  400  300 

私は1つのアイテムが、このようないくつかの固定された量(すなわち1団結)によって増減させる何かを生成したいと思います:それはこのようになりますそれこのようなループではなく、より高速な方法があるかどう疑問に思って:

l1 <- list() 
increment_amt <- 1 
for(i in c('Item_1','Item_2','Item_3')){ 
    newDf <- df1 
    newDf[,i] <- newDf[,i] + increment_amt 
    l1[[i]] <- newDf 
} 

df2 <- do.call(rbind, l1) 

任意の提案は?もちろん

答えて

2
lapply

do.call(rbind, lapply(names(dat)[2:4], function(x) {dat[,x] <- dat[,x] + 1; dat})) 
    Revenue Item_1 Item_2 Item_3 
1  552 201 220  45 
2 1500 401 300 200 
3 2300 601 400 300 
4  552 200 221  45 
5 1500 400 301 200 
6 2300 600 401 300 
7  552 200 220  46 
8 1500 400 300 201 
9 2300 600 400 301 

do.call/rbindはdata.tableを返す、rbindlistdata.tableの迅速化に置き換えることができます。

library(data.table) 
rbindlist(lapply(names(dat)[2:4], function(x) {dat[,x] <- dat[,x] + 1; dat})) 
0

このタスクを実行するには、関数を記述してlapplyを使用します。 dfは元のデータフレームです。 df_listはすべての最終出力を含むリストです。後でdf2 <- do.call(rbind, df_list)、またはbind_rowsdplyrから使用できます。

# A function to add 1 to all numbers in a column 
add_one <- function(Col, dt){ 
    dt[, Col] <- dt[, Col] + 1 
    return(dt) 
} 

# Get the column names 
Col_vec <- colnames(df)[2:ncol(df)] 

# Apply the add_one function 
df_list <- lapply(Col_vec, add_one, dt = df) 

# Combine all results 
df2 <- dplyr::bind_rows(df_list) 
0
# Data frame 
df <- data.frame(Item_1= c(200, 400, 600), 
       Item_2= c(220, 300, 400), 
       Item_3= c(45, 200, 300)) 

# Perturbation 
p <- 1 

# Add to all columns 
df.new <- apply(diag(ncol(df)) * p, MAR = 1, function(x)data.frame(t(t(df) + x))) 

[[1]] 
    Item_1 Item_2 Item_3 
1 201 220  45 
2 401 300 200 
3 601 400 300 

[[2]] 
    Item_1 Item_2 Item_3 
1 200 221  45 
2 400 301 200 
3 600 401 300 

[[3]] 
    Item_1 Item_2 Item_3 
1 200 220  46 
2 400 300 201 
3 600 400 301 
関連する問題