2017-07-10 153 views
0

我有以下数据框:数据框有1000多行,我需要使用最后3列更新列P1-P9。R:如何计算计算字段列中的值R

P1 P2 P3 P4 P5 P6 P7 P8 P9 Noofmonths divamount beginingMonth 
0 0 0 0 0 0 0 0 0 3   29948.333 4 
0 0 0 0 0 0 0 0 0 3   29766.667 4 
0 0 0 0 0 0 0 0 0 3   1778.667 4 
0 0 0 0 0 0 0 0 0 2   2595.6  3 

条件:

if beginingMonth = 4 then select Noofmonths. 
if Noofmonths= 3 then P4 = divamount, P5 = divamount, p6 = divamount 

if beginingMonth = 1 then select Noofmonths.  
if Noofmonths= 1 then P1 = divamount 

if beginingMonth = 2 then select Noofmonths.  
if Noofmonths= 2 then P2 = divamount, P3 = divamount. 
+1

这样的问题已经有很多次被问及(并回答过)了。用搜索引擎搜索“R数据帧条件替换”。 – tagoma

+1

看看可以嵌套的'ifelse'。回报任何问题。 – Parfait

回答

1

这里是一个data.table实现你sql -esque查询:

library(data.table) 

your_dt = data.table(your_df) 

your_dt[beginingMonth == 4 & Noofmonths == 3, 
     .(P4=divamount, P5=divamount, P6=divamount)] 
+0

谢谢大家找到解决办法。基本上会有9个更新声明我需要使用。每个P1到P9一个。 – Kumar

0

您可以使用ifelse或者你可以使用逻辑索引,见R-intro.pdf,部分2.4和2.7。

inx <- dat$beginingMonth == 4 & dat$Noofmonths == 3 
dat$P4[inx] <- dat$P5[inx] <- dat$P6[inx] <- dat$divamount[inx] 

inx <- dat$beginingMonth == 1 & dat$Noofmonths == 1 
dat$P1[inx] <- dat$divamount[inx] 

inx <- dat$beginingMonth == 2 & dat$Noofmonths == 2 
dat$P2[inx] <- dat$P3[inx] <- dat$divamount[inx] 
0

如果你感兴趣的SQL。使用包“sqldf”来编写上面的sql查询。支持通用的sql。 install.packages("sqldf") sqldf::sqldf("query")