Seite 1 von 1

Neue Spalte im Datensatz mit ausgewählten Werten aus einer anderen Spalte

Verfasst: Fr Jan 03, 2020 3:25 pm
von kosa
Liebe Community,

ich hoffe, dass ihr alle gut ins Neue Jahr gestartet seid. :)

Ich habe eine Frage bzgl. der Generierung einer neuen Spalte mit Werten aus einer anderen Spalte.

Ich habe wie in der beispielhaften Tabelle (df) dargestellt. Personen (ID), die zu mehreren Zeitpunkten (time) ein Fragebogenitem (AV) beantworten. Nun würde ich gern eine neue Spalte (AV.t1) zur Tabelle hinzufügen, in welche die Daten jeder Person zum Messzeitpunkt = 1 übertragen werden. Das ganze sollte dann so aussehen:

Code: Alles auswählen

>df
ID	time		AV		AV.t1
1	1		5		5
1	2		4		5
1	3		2		5
2	1		7		7	
2	2		2		7
2	3		3		7	
3	1		1		1
3	2		5		1
3	3		6		1
Kann mir da jemand helfen?

Viele Grüße,

kosa

Re: Neue Spalte im Datensatz mit ausgewählten Werten aus einer anderen Spalte

Verfasst: Fr Jan 03, 2020 4:35 pm
von jogo
Hallo kosa,

Code: Alles auswählen

df$AV.t1 <- ave(df$AV, df$ID, FUN=function(x) x[1])
Gruß, Jörg

Re: Neue Spalte im Datensatz mit ausgewählten Werten aus einer anderen Spalte

Verfasst: Fr Jan 03, 2020 5:05 pm
von kosa
Vielen Dank!

Das ging ja schnell!

Kannst du mir evtl. noch einen Tipp geben, wo ich Funktionen nachschlagen kann?

Ich konnte mir noch nicht erklären, wie R weiß, dass die Spalte "time" mit der Faktorstufe "1" über den Befehl angesprochen wird.


Viele Grüße,

Sabrina

Re: Neue Spalte im Datensatz mit ausgewählten Werten aus einer anderen Spalte

Verfasst: Fr Jan 03, 2020 8:17 pm
von jogo
Hallo Sabrina,
kosa hat geschrieben: Fr Jan 03, 2020 5:05 pm Kannst du mir evtl. noch einen Tipp geben, wo ich Funktionen nachschlagen kann?

Code: Alles auswählen

?ave
help("ave")
help(ave)
In RStudio:
- Cursor auf den Funktionsnamen, dann F1
- oder Suchfeld im Help-Tab nutzen (Fenster rechts unten)
Ich konnte mir noch nicht erklären, wie R weiß, dass die Spalte "time" mit der Faktorstufe "1" über den Befehl angesprochen wird.
ähm, habe ich nicht genutzt. Und auf diese Weise könnte das die Funktion ave() auch nicht.
Ich hatte einfach vorausgesetzt, dass die Beobachtung mit time 1 immer die erste in jedem ID-Block ist.
... also ggf. vorher sortieren.
Oder sind Deine Daten doch irgendwie anders, dass die Anforderung an das Vorgehen auch spezieller wird?

Hier ist noch eine data.table-Variante meines vorherigen Codes:

Code: Alles auswählen

library("data.table")

C <- CO2 ## CO2 ist ein Bespieldatensatz, der standardmäßig in R vorhanden ist
setDT(C)
C[, up1:=uptake[1], Plant]
C
Deine Anforderung, sich nach dem Wert einer anderen Spalte zu richten, könnte dann so aussehen:

Code: Alles auswählen

library("data.table")

C <- CO2 ## CO2 ist ein Bespieldatensatz, der standardmäßig in R vorhanden ist
setDT(C)
C[, up1:=uptake[conc==175], Plant]
C
Für eine ähnliche Lösung mit base R wird man by() oder split()+lapply() bemühen.

Viele Grüße,
Jörg