我有一个数据集,我想在其上执行以下转换:
对于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))
显然,这段代码不完整,但我真的很感激您的帮助。
答案 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 :(得分: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)]