2016-06-23 35 views
2

我認爲這應該很容易做到。我有一個數據框df與幾列。在列a我有1和100之間的不同值。將數據舍入爲最接近的偶數

通過比較他們我想要在df中創建一個列new將它們分組。對它們進行分組的功能應該圍繞最接近的偶數整數a中的值並將其保存在df$new中。如果a = 0它應該設置newNA

請看下面的例子:

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

回答

4

我建議使用內部round函數分割/乘法結合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 

這將返回:

> 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

有兩個選項。假設你有玩具數據:

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 

您可以執行兩個:

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 

因此,對於你的數據幀,你可以這樣做:

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

在最後一行設置NA部分很容易理解。

+0

我明白,但**一個** = 84.2越來越** new ** = 86,但應該是84.同樣在你的例子中,第一個條目:4.6應該得到4,而不是6. 要澄清:1.5≤x> 2.5之間的所有內容應該變成2 – Max

+1

@Zheyuan Li:It可能是'round'而不是'ceiling'。 – user2100721

+0

@ Zheyuan Li:我對'Max'的期望輸出感到困惑。通過基本的四捨五入原則'4.6'必須四捨五入到'5',並且根據'Max'的願望它應該是'6'。 – user2100721

相關問題