2017-07-14 134 views
0

我试图在数据框中创建一个新变量(创建一个新列)。对于每个观察值计算的值都不相同,所以我使用for循环。比方说,我想添加到数据帧REPLIC新变量称为PL将值设置为一个新变量

REPLIC$PL <- for (i in 1:ncol(REPLIC)) if (REPLIC$FTR[i]=="D") { REPLIC$PL[i] <- REPLIC$f_of_bet[i]*starting_budget*REPLIC$max[i])} else { REPLIC$PL[i] <- REPLIC$f_of_bet[i]*starting_budget*-1}

我一直在使用发生变异

REPLIC <- mutate(REPLIC, PL = for loop goes here)

也尝试应用函数

也尝试

REPLIC$PL <- apply(REPLIC,1, for loop here)

I对R而言,我并没有真正明白我在这里失去的东西。到目前为止我管理的唯一事情是在全球环境中创建PL值。如果有人能指导我,我会很开心。

回答

0

不需要在这里使用循环,所有的事情都可以使用矢量来完成。 由于您没有分享有关您的数据的任何信息,因此我必须做出一些假设,如果这些错误请纠正。

#create fake data 

starting_budget <- 1000 

REPLIC <- data.frame(FTR = c(rep('D',5),rep('A',5)),f_of_bet = runif(10),max=runif(10)) 

> REPLIC 
    FTR f_of_bet  max 
1 D 0.78590664 0.3620227 
2 D 0.15498935 0.4921082 
3 D 0.20469729 0.5597419 
4 D 0.01167919 0.3677215 
5 D 0.32862533 0.5531767 
6 A 0.52029750 0.5391566 
7 A 0.63206626 0.9727405 
8 A 0.54632605 0.7221810 
9 A 0.58939969 0.6103260 
10 A 0.15375445 0.1996567 

以下代码将添加您的新列。我使用ifelse,因为你有FTR条件:

REPLIC$PL <- ifelse(REPLIC$FTR == 'D', 
        REPLIC$f_of_bet * starting_budget * REPLIC$max, 
        REPLIC$f_of_bet * starting_budget * -1) 

这给了你:

> REPLIC 
    FTR f_of_bet  max   PL 
1 D 0.78590664 0.3620227 284.51602 
2 D 0.15498935 0.4921082 76.27153 
3 D 0.20469729 0.5597419 114.57764 
4 D 0.01167919 0.3677215 4.29469 
5 D 0.32862533 0.5531767 181.78787 
6 A 0.52029750 0.5391566 -520.29750 
7 A 0.63206626 0.9727405 -632.06626 
8 A 0.54632605 0.7221810 -546.32605 
9 A 0.58939969 0.6103260 -589.39969 
10 A 0.15375445 0.1996567 -153.75445 
+0

哇哦!并不认为解决方案可能如此简单。直到现在还不知道ifelse函数。非常感谢!!顺便说一句 - 关于for循环,我是否也需要在某处使用'break',或者在完成数据框后才停止? –

+0

一个for循环会在迭代所有输入元素时完成(在你的案例中'1:ncol'将遍历所有列索引,如果添加一个'break',循环将完全停止在它所在的位置遇到。 – Val