2017-01-03 6 views
1

Ich habe einen Datenrahmen in R mit vier Spalten. Was ich tun möchte, ist, wenn eine Bedingung mit einer Zeile in der Spalte AI erfüllt ist, die den Wert dieser Zeile in Spalte C abgleichen soll, und finde die letzte Instanz, in der der Wert in Spalte B erschien, und füge dann eine Zahl zu dieser Zeile hinzu für Spalte D. Hier ist ein Beispiel von dem, was ich habe, was ich will. Wenn df $ 3 a == dann den Wert dieser Zeile in Spalte C übereinstimmen („Jim“) bis zum letzten Mal in Spalte B erschien, und dann 3 in Spalte dieser Zeile hinzufügen D.R Finden der letzten Instanz der Zeichenfolge in einer Spalte, die in einer zweiten Spalte basierend auf Bedingung ist

Have            Want 
a b c d         a b c d 
21 Jim - 0         21 Jim - 0 
2 Jim - 1         2 Jim - 4 
3 Stan Jim 2         3 Stan Jim 2 
2 Bill - 4         2 Bill - 4 

Antwort

1
# a different sample with more variety was used 
#> df 
# a b c d 
#1: 21 Joel - 3 
#2: 2 Jim - 1 
#3: 2 Jim - 7 
#4: 3 Stan Jim 2 
#5: 2 Bill - 4 
#6: 3 Jim Joel 3 

# 1. determine the locations where a==3 
x = which(df$a == 3) 
# [1] 4 6 

# 2. determine the corresponding names from c 
y = df$c[which(df$a == 3)] 
# [1] "Jim" "Joel" 

# 3. determine the locations where to add +3 to d 
z = sapply(seq_along(y), function(i) max(grep(y[i], df$b[1:x[i]]))) 
# [1] 3 1 

# 4. add +3 to those 
df$d[z] = df$d[z] + 3 

# a b c d 
#1: 21 Joel - 6 
#2: 2 Jim - 1 
#3: 2 Jim - 10 
#4: 3 Stan Jim 2 
#5: 2 Bill - 4 
#6: 3 Jim Joel 3 

Hinweis: obigen Fall angenommen, dass ein Wert y entspricht, wird immer in b finden. Aber wenn eine Ausnahme auftritt: wie angenommen, erste Zeile b hatte jacky dann max() gibt Inf zurück. Deshalb bevorzugen

df$d[z[!is.infinite(z)]] = df$d[z[!is.infinite(z)]] + 3 
+0

@ grig109 beantwortet es auch Frage? Geist besuchen hier http://StackOverflow.com/Help/Someone-answers –

+1

Ja, es tut. Tut mir leid, ich bin gerade dabei, mein Problem zu testen, und es hat funktioniert. Vielen Dank. – grig109

2

es ist ein wenig grep schwer, aber es funktioniert:

df <- data.frame(a = c(21,2,3,2), 
       b = c("Jim", "Jim", "Stan", "Bill"), 
       c = c(NA, NA, "Jim", NA), 
       d = c(0,1,2,4)) 

target <- 3 

df$d[max(grep(df$c[grep(target, df$a)], df$b))] <- df$d[max(grep(df$c[grep(target, df$a)], df$b))] + target 
# or 
a_match_pos <- grep(target, df$a) 
last_c_match_pos <- max(grep(df$c[a_match_pos], df$b)) 
df$d[last_c_match_pos] <- df$d[last_c_match_pos] + target 

> df 
a b c d 
1 21 Jim <NA> 0 
2 2 Jim <NA> 4 
3 3 Stan Jim 2 
4 2 Bill <NA> 4 
Verwandte Themen