2016-06-23 10 views
2

Ich denke, das sollte einfach zu tun sein. Ich habe einen Datenrahmen df mit mehreren Spalten. In der Spalte a habe ich verschiedene Werte zwischen 1 und 100.Runden Daten auf die nächste gerade ganze Zahl

Durch den Vergleich möchte ich eine Spalte new in der df erstellen, um sie zu gruppieren. Die Funktion zum Gruppieren sollte den Wert in a zu der nächsten geraden ganzen Zahl runden und in df$new speichern. Bei a = 0 sollte new auf NA gesetzt werden.

Siehe das folgende Beispiel:

... a ... new 
--------------- 
    0  NA 
    87.3 88 
    88.1 88 
    81.7 82 
    79.2 80 
    89.4 90 

Antwort

4

Ich würde vorschlagen, die interne round Funktion mit der Division/Multiplikation kombiniert zu verwenden, mit 2.

df <- data.frame(a = c(0, 87.3, 88.1, 81.7, 79.2, 89.4)) 

# Round to nearest even integer 
df$new <- 2 * round(df$a/2) 

# Set 0 values of original array to NA in the result 
df$new[df$a == 0] <- NA 

Das gibt:

> df 
    a new 
1 0.0 NA 
2 87.3 88 
3 88.1 88 
4 81.7 82 
5 79.2 80 
6 89.4 90 
3

Es gibt zwei Möglichkeiten. Angenommen, Sie Spielzeug Daten:

set.seed(0); x <- round(runif(10, 1, 5),1) ## toy data 
# [1] 4.6 2.1 2.5 3.3 4.6 1.8 4.6 4.8 3.6 3.5 

Sie können eine der beiden tun:

ceiling(x) - ceiling(x) %% 2 
# [1] 4 2 2 4 4 2 4 4 4 4 

floor(x) + floor(x) %% 2 
# [1] 4 2 2 4 4 2 4 4 4 4 

Also für Ihre Datenrahmen, die Sie tun können:

df$new <- floor(df$a) + floor(df$a) %% 2 
df$new[df$a == 0] <- NA 

wo die letzte Zeile Einstellung NA Teil ist einfach zu verstehen.

+0

Ich verstehe, aber ** a ** = 84,2 wird immer ** neu ** = 86, sollte aber 84 sein. Gleiches in Ihrem Beispiel, der erste Eintrag: 4.6 sollte 4, nicht 6. zu klären: alles zwischen 1,5 ≤ x> 2,5 sollte 2 – Max

+1

@Zheyuan Li werden: Es vielleicht "rund" statt "decke". – user2100721

+0

@ Zheyuan Li: Ich bin verwirrt über die gewünschte Ausgabe von 'Max'. Nach dem Grundrundungsprinzip muss "4.6" auf "5" und nach "Max" auf "6" gerundet werden. – user2100721

Verwandte Themen