2015-12-09 146 views
1

我有一個數據集,我想要執行以下轉換: 對於x_1中的每個ID,將z_1下的最大負數(最接近於零)更改爲零。保留其他負數或正數。如果沒有負數,或者有零,則什麼也不做。棘手的數據操縱

x_1 <- c("A1", "A1","A1", "B10", "B10", "B10","B10", "B500", "C100", "C100", "C100", "D40", "G100", "G100") 

z_1 <- c(1.1, 1.4, 1.6, -1.0, -2.2, 3, 2.3, 2.0, -3.4, -4.1, 2, 2, 2.4, -3.5) 

A <- data.frame(x_1, z_1) 

期望的結果:

x_1 z_1 
A1 1.1 
A1 1.4 
A1 1.6 
B10 -2.2 
B10 0 
B10 2.3 
B10 3.0 
B500 2.0 
C100 -4.1 
C100 0 
C100 2.0 
D40 2.0 
G100 0 
G100 2.4 

我試着用dplyr的幾件事情,但我似乎並沒有越來越正確的結果。

A3 <- A %>%group_by(x_1, z_1)%>% summarize(neg = max(z_1 < 0)) 

顯然,這段代碼是不完整的,但我真的很感謝任何幫助。

回答

2

這似乎產生結果,你的願望

A %>% group_by(x_1) %>% 
    mutate(z_1=ifelse(z_1==max(c(-Inf,z_1[z_1<0])), 0,z_1)) %>% 
    arrange(x_1, z_1) 
1

使用data.table

library(data.table) 
i1 <- setDT(A)[, .I[z_1== max(c(-Inf, z_1[z_1 <0]))],,x_1]$V1 
A[i1, z_1:= 0.0][order(x_1, z_1)] 
+1

謝謝您的回答! –