2017-11-24 4 views
2
Subj Trial Time 
1 A  1  250 
2 A  2  250 
3 A  3  280 
4 B  1  250 
5 B  2  270 
6 B  3  290 

Oben ist ein Beispiel für die Daten, mit denen ich arbeite. Ich habe verschiedene Fächer (Subj), die den gleichen Satz von Versuchen (Versuch) durchführen. Wenn das Test-Ereignis schnell hintereinander auftritt, druckt mein Gerät leider die gleichen Zeitwerte (siehe Spalte Zeit für die Zeilen 1 und 2).
Ich kann nicht das gleiche Thema haben doppelte Zeitwerte, aber es ist in Ordnung für verschiedene Themen, die gleichen Zeitwerte zu haben. Daher brauche ich einen Weg, Duplikate bedingt zu ändern, so dass NUR Zeitduplikate innerhalb eines bestimmten Themas geändert werden.

Idealerweise würde Ich mag das obige Beispiel, um etwas zu ändern, wie unten:R: Ändern doppelter Werte innerhalb von Themen

Subj Trial Time 
1 A  1  250 
2 A  2  250.5 
3 A  3  280 
4 B  1  250 
5 B  2  270 
6 B  3  290 

Alle Empfehlungen, wie ich in der Lage könnte dies zu erreichen?

Danke!

Antwort

2

Eine Lösung mit dplyr. Wir können Gruppe die Daten von Subj und Time, zählen die Anzahl der Ereignisse, und dann die Time durch 0.5 Hinzufügen ändern, wenn Anzahl der Vorkommen mehr als 1.

library(dplyr) 

dt2 <- dt %>% 
    group_by(Subj, Time) %>% 
    mutate(Count = row_number()) %>% 
    ungroup() %>% 
    mutate(Time = ifelse(Count > 1, Time + 0.5, Time)) %>% 
    select(-Count) 
dt2 
# # A tibble: 6 x 3 
# Subj Trial Time 
# <chr> <int> <dbl> 
# 1  A  1 250.0 
# 2  A  2 250.5 
# 3  A  3 280.0 
# 4  B  1 250.0 
# 5  B  2 270.0 
# 6  B  3 290.0 

DATA

dt <- read.table(text = " Subj Trial Time 
1 A  1  250 
2 A  2  250 
3 A  3  280 
4 B  1  250 
5 B  2  270 
6 B  3  290", 
       header = TRUE, stringsAsFactors = FALSE) 
+1

Vielen Dank! Diese Lösung funktioniert perfekt !! Obwohl ich ein bisschen Mühe hatte, es zuerst zum Laufen zu bringen ...... Ich hatte meinen Datenframe nicht angehängt und stattdessen nur die Spalten über dt $ Subj oder dt $ Time aufgerufen.Dies führte dazu, dass ich bei der zweiten Mutation einen Fehler "Unerwartet =" erhielt. Nachdem ich den Datenrahmen angeschlossen und die Spalten aufgerufen habe (wie Sie in Ihrem Beispiel zeigen), hat es funktioniert! Danke nochmal! –

2

ist Etwas ähnlich der bereits bereitgestellten Lösung, aber ohne zu zählen. Diese besteht aus zwei Lösungen:

base R:

do.call(rbind, lapply(split(df, list(df$Subj, df$Time)), function(x) { 
    x$Time <- x$Time + seq(0, by=0.5, length.out=nrow(x)) 
    x 
})) 

tidyverse

library(dplyr) 


df %>% 
    group_by(Subj, Time) %>% 
    mutate(Time2 = Time + seq(0, by=0.5, length.out=n())) 

Sie sollten beide Ausbeute etwas wie die folgende:

# Subj Trial Time 
# A 1  250.0 
# A 2  250.5 
# B 1  250.0 
# B 2  270.0 
# A 3  280.0 
# B 3  290.0 

Der Schlüssel ist, zu spalten Ihr Dataframe in Stücke, die vom com definiert werden Bination der Säulen von Subj und Time. Von hier aus ist der Rest einfach: Sie erhöhen die Werte in der Spalte Time um 0.5 beginnend mit 0, wobei die Länge einer solchen Sequenz der des Chunks entspricht.

Ich hoffe, das erweist sich als nützlich.

+0

Diese Lösung funktioniert auch gut! Vielen Dank für Ihre Antwort. –

1

Hier ist eine base R Option mit duplicated. Wir erstellen einen logischen Index für doppelte Elemente basierend auf den Spalten 'Subj', 'Time' und weisen dann den Wert 'Time' für diese Elemente zu, indem wir 0,5 hinzufügen.

i1 <- duplicated(df1[c('Subj', 'Time')]) 
df1$Time[i1] <- df1$Time[i1] + 0.5 
df1 
# Subj Trial Time 
#1 A  1 250.0 
#2 A  2 250.5 
#3 A  3 280.0 
#4 B  1 250.0 
#5 B  2 270.0 
#6 B  3 290.0 
Verwandte Themen