2016-04-17 4 views
-2

Ich möchte eine neue Spalte zu einer data.frame basierend auf dem letzten Eintrag in einer Zeichenfolge hinzufügen, so dass ich eine Regressionsanalyse durchführen kann. Insbesondere versuche ich Informationen aus der Variablen Fertiliser zu extrahieren, die Informationen über die Menge von drei verschiedenen Arten von Düngemitteln enthält, die durch Bindestriche getrennt sind. Zum Beispiel: 0-0-0 oder 30-10-2700 sind lebensfähig. Der letzte Abschnitt der Zeichenfolge ist, was ich z. x-y-z Ich brauche z.Hinzufügen neuer Spalten zu einem Datenrahmen durch Trennen von Zeichenketten in einer vorhandenen Spalte

Ich versuchte, aber war nicht in der Lage, die Antwort hier auf diesen Fall anzupassen.

vollständigeres Beispiel der Daten:

Fertiliser millet_biomass millet_yield 
1:  0-0-0  2659.608  710.6942 
2: 0-0-100  2701.044  718.1154 
3: 0-0-2700  3415.879  804.0360 
4: 0-0-300  2781.639  730.5943 
5: 0-0-900  2997.173  760.0136 
6:  12-4-0  3703.255  772.1719 
7: 12-4-100  3720.247  773.1759 
8: 12-4-2700  3950.189  788.6133 
9: 12-4-300  3751.400  775.1368 
10: 12-4-900  3826.693  780.2623 
11: 30-10-0  4180.323  798.2134 
12: 30-10-100  4184.229  798.4918 
13: 30-10-2700  4217.044  800.9312 
14: 30-10-300  4187.014  798.6570 
15: 30-10-900  4194.873  799.2085 
16:  6-2-0  3296.274  765.8496 
17: 6-2-100  3326.844  767.6693 
18: 6-2-2700  3772.058  785.4535 
19: 6-2-300  3381.152  760.7330 
20: 6-2-900  3517.515  768.3018 
21: 90-30-0  4542.924  831.2832 
22: 90-30-100  4543.036  831.3983 
23: 90-30-2700  4545.037  831.3227 
24: 90-30-300  4543.240  831.3921 
25: 90-30-900  4543.733  831.3727 

So gibt es fünf Muster -0$, -100$, -300$, -900$, 2700$, die durch 0 ersetzt werden müssen, 100, 300, 900, 2700

Antwort

2

Wollen Sie das tun? Lassen Sie uns einen Ausschnitt der Daten übernehmen:

Fertiliser <- c("0-0-0", "0-0-100", "0-0-2700", "0-0-300") 
millet_yield <- c(710, 718, 804, 730) 
df <- data.frame(Fertiliser, millet_yield) 

df wie folgt aussieht:

Fertiliser millet_yield 
#1  0-0-0   710 
#2 0-0-100   718 
#3 0-0-2700   804 
#4 0-0-300   730 

Mit separate() aus dem tidyr Paket:

library(tidyr) 
df %>% separate(Fertiliser, into=(c("F1", "F2", "Manure")), sep="-", convert=T) 

    F1 F2 Manure millet_yield 
#1 0 0  0   710 
#2 0 0 100   718 
#3 0 0 2700   804 
#4 0 0 300   730 

convert=T sicher numerisch die Zeichenketten werden lässt. Jetzt können Sie eine Regression für Ihre Daten ausführen.

+0

Ja, das ist genau das, was ich brauche. Die Spalten werden dem data.frame jedoch nicht hinzugefügt. Wie kann ich es tun? Ich bin nicht an den Operator%>% –

+0

Oh, du meinst, du wolltest die ursprüngliche Spalte behalten?Dann ist 'df%>% getrennt (Dünger, in = (c (" F1 "," F2 "," Gülle ")), sep =" - ", umrechnen = T, entfernen = F)'. Alle anderen Spalten werden beibehalten. Der Operator '%>%' dient nur zum Verketten von Funktionen in 'tidyr' und' dplyr'. – Joe

+0

Nein, nein, die ursprüngliche Spalte ist nicht notwendig. Das Ergebnis zeigt sich perfekt in der Konsole, aber nicht im data.frame (Environment-> Data). Es zeigt immer noch dieselben Variablen an wie vor der Ausführung der Linie: S –

0

Wir können die letzten Zahlen mit stri_extract_last von stringi extrahieren. Da das Dataset bereits ein data.table ist, können Sie die data.table Methoden verwenden, um eine neue Spalte zuzuweisen (:=).

library(data.table) 
library(stringi) 
setDT(df1)[, Manure := as.numeric(stri_extract_last_regex(Fertiliser, "\\d+"))] 
head(df1) 
# Fertiliser millet_biomass millet_yield Manure 
#1:  0-0-0  2659.608  710.6942  0 
#2: 0-0-100  2701.044  718.1154 100 
#3: 0-0-2700  3415.879  804.0360 2700 
#4: 0-0-300  2781.639  730.5943 300 
#5: 0-0-900  2997.173  760.0136 900 
#6:  12-4-0  3703.255  772.1719  0 

Oder eine base R Option ist

df1$Manure <- as.numeric(sub(".*-", "", df1$Fertiliser)) 
+0

Es funktioniert. Ich mag diesen Stil wirklich. Können wir mit stringi auch eine neue Spalte mit nur bestimmten Wörtern innerhalb eines Zeichens erstellen? aus einer Spalte mit Werten "Millet high SOC"; "Millet Medium SOC" und "Millet Low SOC" Ich möchte eine neue Spalte erstellen, die entweder "high", "medium" oder "low" enthält. –

+0

@ M.Jimenez Sie könnten 'setDT (df1) [, NewCol: = stri_extract verwenden (Col, regex = "(? <= \\ s) \\ w +")] ' – akrun

+1

Prägnant und effektiv. Vielen Dank –

0

Sie können dies ganz einfach mit sub, alles zu entfernen bis zu und einschließlich des letzten Bindestrich-Zeichen:

transform(x, Fertiliser = sub('.*-', '', Fertiliser)) 
##  Fertiliser millet_biomass millet_yield 
## 1:   0  2659.608  710.6942 
## 2:   100  2701.044  718.1154 
## 3:  2700  3415.879  804.0360 
## 4:   300  2781.639  730.5943 

..

Hier ist die .* gierig, also passt sie so gut wie möglich zusammen, bevor sie mit dem endgültigen Zeichen übereinstimmt.

Sie können auch die resultierenden Spalt umbenennen, anstatt Fertiliser ersetzt:

transform(x, Quantity = sub('.*-', '', Fertiliser))