【问题标题】:Tricky Data manipulation棘手的数据操作
【发布时间】:2015-12-09 23:30:50
【问题描述】:

我有一个数据集,我想对其执行以下转换: 对于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))

显然,此代码不完整,但我非常感谢您提供任何帮助。

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    这似乎产生了你想要的结果

    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)
    

    【讨论】:

      【解决方案2】:

      使用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)]
      

      【讨论】:

      • 感谢您的回答!
      猜你喜欢
      • 1970-01-01
      • 2011-09-20
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多