2017-04-21 4 views
1

Angenommen, wir haben einen Datenrahmen mit zwei Spalten, ein Zeichen, ein numerisches:Concatenate String Zeilen eines Datenrahmens nur in bestimmten Indizes

df <- data.frame(chr = letters[1:10], 
      ind = c(NA, NA, 1, NA, NA, 2, NA, NA, 3, NA)) 

    chr ind 
1 a NA 
2 b NA 
3 c 1 
4 d NA 
5 e NA 
6 f 2 
7 g NA 
8 h NA 
9 i 3 
10 j NA 

Wie würden Sie die Zeilen der chr Spalte einfügen jedes Mal nehmen nur Zeilen zwischen nicht NA Indizes in ind?

Ich möchte die ersten Reihen, bis der erste Nicht- NA ignoriert, dann stoßen wir ind = 1, dann verketten „d“ und „e“, dann stoßen wir ind = 2, dann verketten „g“ und „h ", etc. zu erstellen:

newChar 
"d e" 
"g h" 
"j" 

Wie würden Sie das ohne eine for-Schleife tun?

+0

Sie die Frage gestellt, und in der Minute dachte Sie die Lösung aus, schrieb den gesamten Code unten ein und entsandte sie hier? – BigDataScientist

+0

Nein, ich schrieb die Frage, dachte dann, ich müsse es lösen können, dachte dann, meine Lösung könnte anderen nützen, und stellte sowohl Frage als auch Antwort. Ist das nach SO "Gesetzen" falsch? Sag es mir und ich werde alles löschen. –

+0

fair genug. Ich kenne die Regeln nicht, es verwirrte mich nur ein bisschen;) – BigDataScientist

Antwort

1

OK, ich habe es. Der Trick ist, zoo::na.locf zu verwenden, um die NA Werte zu füllen und dann group_by und paste:

library(dplyr) 
library(zoo) 
df %>% 
    mutate(bool = is.na(ind), groupID = na.locf(ind, na.rm = FALSE)) %>% 
    filter(bool & !is.na(groupID)) %>% group_by(groupID) %>% 
    summarise(newChr = paste(chr, collapse = " ")) %>% 
    select(newChr) 
Verwandte Themen