2017-07-10 2 views
0

Ich habe folgenden Datenrahmen: Dataframe hat mehr als 1000 Zeilen, ich muss die Spalten P1-P9 mit den letzten 3 Spalten aktualisieren.R: Wie berechne ich den Wert in der berechneten Feldspalte in 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 

Zustand:

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

Eine solche Frage wurde so oft gestellt (und beantwortet). Suchen Sie "R Datenrahmen bedingter Ersatz" mit der Suchmaschine. – tagoma

+1

Sieh dir 'ifelse' an, das verschachtelt werden kann. Melden Sie sich mit irgendwelchen Problemen zurück. – Parfait

Antwort

1

Hier ist eine data.table Umsetzung Ihrer sql -esque query:

library(data.table) 

your_dt = data.table(your_df) 

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

Vielen Dank, dass Sie alle gefunden haben, damit umzugehen. Grundsätzlich wird es 9 Update-Statements geben, die ich verwenden muss. Eine für jede P1 bis P9. – Kumar

0

können Sie verwenden ifelse oder Sie logischen Indizes verwenden können, finden R-intro.pdf, Abschnitte 2.4 und 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

Wenn Sie in SQL interessiert sind. Verwenden Sie das Paket "sqldf", um SQL-Abfragen für das oben genannte zu schreiben. Unterstützt generische SQL. sqldf::sqldf("query")

Verwandte Themen