2016-08-08 17 views
0

r-Noob hier mit einer Frage nicht von sich selbstfügen Sie in jeder n-ten Zeile oder entsprechend einer Spezifikation Werte zu einem Datenrahmen hinzu. Spaltenwert

I einen Datenrahmen mit der Länge von 250

head(abto, 20) 
    See Transekt plant Blatt# breiteo breitez bez 
1: ABT  A  1  1 2.0182 5.3980 1 
2: ABT  A  1  1 1.9730 4.2522 1 
3: ABT  A  1  1 1.8024 3.7587 1 
4: ABT  A  1  2 2.2081 4.2880 2 
5: ABT  A  1  2 2.2858 6.1115 2 
6: ABT  A  1  2 1.8532 5.7426 2 
7: ABT  A  1  3 2.0384 4.9074 2 
8: ABT  A  1  3 2.0757 4.8801 2 
9: ABT  A  1  3 1.8034 4.6111 2 
10: ABT  A  1  4 1.9567 4.8879 2 
11: ABT  A  1  4 1.9080 5.0652 2 
12: ABT  A  1  4 1.8346 4.8862 2 
13: ABT  A  1  5 2.0282 4.5545 1 
14: ABT  A  1  5 2.1356 5.7157 1 
15: ABT  A  1  5 1.7594 6.1688 1 
16: ABT  A  2  1 1.6457 5.2868 1 
17: ABT  A  2  1 1.6942 5.0414 1 
18: ABT  A  2  1 2.0544 5.6711 1 
19: ABT  A  2  2 2.1342 5.2867 2 
20: ABT  A  2  2 1.9107 6.2139 2 

und einem Vektor mit der Länge von 84 (nur ein Drittel minus hava lösen 2 als der erste)

> head(databtzl) 
    abtl.wert 
1 22.7738 
2 24.9137 
3 24.9474 
4 25.0498 
5 25.0431 
6 21.1024 

grundsätzlich habe ich einen Datenrahmen mit 3 Messungen der Torflügelbreite (Blatt #) und einem Vektor mit einer Messung der Länge. Ich versuche, sie in einem zusammenzuführen, aber die Längenwerte auf jede dritte Zeile zu setzen.

Ich denke, es gibt so viele Lösungen, ich dachte daran, 2 leere Zellen zwischen jedem Wert des Vektors zu erstellen und sie dann zusammenzuführen.

Da es im Datenrahmen einige Unregelmäßigkeiten gibt (zweimal nur 2 Werte für die Breite statt 3), dachte ich an eine Funktion/Schleife, um einen Wert des Vektors jedes Mal zu setzen, wenn sich der Wert von abto $ Blatt # ändert .

Sorry für die umständliche Frage, ich hoffe jemand versteht mein Problem.

Vielen Dank im Voraus!

Edit: Meine erwartete Ausgabe ist die folgende Tabelle mit abtl.wert als die Werte aus dem databtzl Vektor ...

  See Transekt plant Blatt# breiteo breitez bez length 
    1: ABT  A  1  1 2.0182 5.3980 1 abtl.wert1 
    2: ABT  A  1  1 1.9730 4.2522 1 
    3: ABT  A  1  1 1.8024 3.7587 1 
    4: ABT  A  1  2 2.2081 4.2880 2 abtl.wert2 
    5: ABT  A  1  2 2.2858 6.1115 2 
    6: ABT  A  1  2 1.8532 5.7426 2 
    7: ABT  A  1  3 2.0384 4.9074 2 abtl.wert3 
    8: ABT  A  1  3 2.0757 4.8801 2 
    9: ABT  A  1  3 1.8034 4.6111 2 
+0

Was ist Ihre erwartete Ausgabe – akrun

+0

In den Daten zeigten, haben Sie 20 Zeilen, und für die zweite Daten ist es 6 Zeilen, können Sie überprüfen, die Lösung, die ich zur Verfügung gestellt. Es ist nicht klar, wie die Länge zusammenpassen wird. – akrun

+0

danke für die Mühe, werde es in einer Sekunde versuchen! Ich habe wieder bearbeitet, der erste Datenrahmen hat eine Länge von 250, der Vektor eine Länge von 84. Also zwei mal gibt es nur 2 Werte für die Breite statt 3 ... – rhavan

Antwort

0

Wenn ich Ihr Problem zu verstehen, sollten folgende Arbeiten:

## Compute the rows in abto to add the values from databtz$abtl.wert 
## Here, we look for changes in adjoining rows of the Blatt# column 
## using diff. Descending in rows, the row before the change will have 
## a diff != 0. We want to mark the next row as well as the first row, 
## so prepend this resulting vector with TRUE 
rind <- c(TRUE, diff(abto$`Blatt#`) != 0) 

## Then it is just a matter of adding a new column to abto named length 
## and inserting the values from databtz1$abtl.wert only for the rows 
## that are marked (identified by which(rind==1)) 
result <- data.frame(abto, length=rep(NA,nrow(abto))) 
result[which(rind==TRUE),"length"] <- databtz1$abtl.wert 

Bei dieser Antwort wird davon ausgegangen, dass die Anzahl der Zeilen in databtz1 mit der Anzahl der Zeilen übereinstimmt, bei denen sich abto$Blatt# ändert.

Mit diesen Eingangsdatum:

abto <- structure(list(See = c("ABT", "ABT", "ABT", "ABT", "ABT", "ABT", 
"ABT", "ABT", "ABT", "ABT", "ABT", "ABT", "ABT", "ABT", "ABT", 
"ABT", "ABT", "ABT", "ABT"), Transekt = c("A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A"), plant = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), `Blatt#` = c(1L, 1L, 1L, 
2L, 2L, 2L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 1L, 1L, 1L, 2L, 2L 
), breiteo = c(2.0182, 1.973, 1.8024, 2.2081, 2.2858, 1.8532, 
2.0384, 2.0757, 1.9567, 1.908, 1.8346, 2.0282, 2.1356, 1.7594, 
1.6457, 1.6942, 2.0544, 2.1342, 1.9107), breitez = c(5.398, 4.2522, 
3.7587, 4.288, 6.1115, 5.7426, 4.9074, 4.8801, 4.8879, 5.0652, 
4.8862, 4.5545, 5.7157, 6.1688, 5.2868, 5.0414, 5.6711, 5.2867, 
6.2139), bez = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L)), .Names = c("See", "Transekt", 
"plant", "Blatt#", "breiteo", "breitez", "bez"), class = "data.frame", row.names = c(NA, 
-19L)) 

databtz1 <- structure(list(abtl.wert = c(22.7738, 24.9137, 24.9474, 25.0498, 
25.0431, 21.1024, 28.9083)), .Names = "abtl.wert", class = "data.frame", row.names = c(NA, 
-7L)) 

bekomme ich diese:

print(result) 
##  See Transekt plant Blatt. breiteo breitez bez length 
##1 ABT  A  1  1 2.0182 5.3980 1 22.7738 
##2 ABT  A  1  1 1.9730 4.2522 1  NA 
##3 ABT  A  1  1 1.8024 3.7587 1  NA 
##4 ABT  A  1  2 2.2081 4.2880 2 24.9137 
##5 ABT  A  1  2 2.2858 6.1115 2  NA 
##6 ABT  A  1  2 1.8532 5.7426 2  NA 
##7 ABT  A  1  3 2.0384 4.9074 2 24.9474 
##8 ABT  A  1  3 2.0757 4.8801 2  NA 
##9 ABT  A  1  4 1.9567 4.8879 2 25.0498 
##10 ABT  A  1  4 1.9080 5.0652 2  NA 
##11 ABT  A  1  4 1.8346 4.8862 2  NA 
##12 ABT  A  1  5 2.0282 4.5545 1 25.0431 
##13 ABT  A  1  5 2.1356 5.7157 1  NA 
##14 ABT  A  1  5 1.7594 6.1688 1  NA 
##15 ABT  A  2  1 1.6457 5.2868 1 21.1024 
##16 ABT  A  2  1 1.6942 5.0414 1  NA 
##17 ABT  A  2  1 2.0544 5.6711 1  NA 
##18 ABT  A  2  2 2.1342 5.2867 2 28.9083 
##19 ABT  A  2  2 1.9107 6.2139 2  NA 

Bitte beachte, dass ich eine Zeile mit Blatt# gleich 3 entfernt von Ihren ursprünglichen Daten geschrieben Ihre Unregelmäßigkeiten zu simulieren, und fügte hinzu, ein Zeile in databtz1$abtl.wert, so dass wir die gleiche Anzahl von Änderungen in Blatt# wie wir Zeilen von databtz1$abtl.wert haben.

+0

Wow, elegant und super effizient! vergib mir, da ich ein Anfänger bin, scheint das ziemlich magisch zu sein. Danke tausendmal! Ich denke, ich habe viel gelernt :) Für zukünftige Probleme wie dieses, habe ich Probleme, nützliche Ressourcen für Daten Jonglierprobleme zu finden. Kannst du eins empfehlen? Danke noch einmal! – rhavan

+0

@rhavan tatsächlich, ist eine gute Ressource in StackOverflow beteiligt, sowohl Fragen zu stellen und zu beantworten. Sie finden neue und unterschiedliche Ansätze, um Probleme aus der Community zu lösen, und lernen diese dann kennen, indem Sie tiefer in die Dokumentation einsteigen. Viel Glück! – aichao