当同一个ID既有正值又有负值时,请从ID中选择正值

时间:2019-02-13 07:46:12

标签: python r postgresql

screenshot我有一张桌子。第一行是id,第二行是value。该表有很多行。我只想拥有一个值的唯一ID。如果相同的ID同时具有负值和正值,则我将选择正值(1)并删除负值(0)。查看截图。如果您给我任何使用R,Python或Postgresql的解决方案,我都会很高兴。谢谢你的帮助!

hadm_id rass_v
100001    0
100003    0
100003    1
100006    0
100006    1
100007    0
100007    1
100009    0
100009    1
100010    0
100010    1
100011    0
100011    1

5 个答案:

答案 0 :(得分:1)

在R

aggregate(rass_v~hadm_id, df, max)
#   hadm_id rass_v
# 1  100001      0
# 2  100003      1
# 3  100006      1
# 4  100007      1
# 5  100009      1
# 6  100010      1
# 7  100011      1

答案 1 :(得分:0)

您可以为此使用熊猫:

import pandas as pd

d = {'hadmid': [1, 1, 2], 'rass_v': [3, -3, 4]}
df = pd.DataFrame(data=d)

boolean_mask = df.rass_v > 0
df = df[boolean_mask]

答案 2 :(得分:0)

欢迎您!

以下是使用R的几种可能性之一:

df <- data.frame(
     hadm_id = c(100001, 100003, 100003, 100006, 100006, 100007, 100007,
                 100009, 100009, 100010, 100010, 100011, 100011),
      rass_v = c(0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1)
)
# Edit: for better readability please use @Moody_Mudskipper's answer:    
# df <- setNames(aggregate(df$rass_v, by = list(df$hadm_id), max), names(df))
df <- aggregate(rass_v~hadm_id, df, max)

print(df)

有关更多信息,请参见this

这是更快的data.table解决方案(适用于较大的表):

library(data.table)
DT <- data.table(
     hadm_id = c(100001, 100003, 100003, 100006, 100006, 100007, 100007,
                 100009, 100009, 100010, 100010, 100011, 100011),
      rass_v = c(0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1)
)

DT <- DT[DT[, .I[which.max(rass_v)], by=hadm_id]$V1]
print(DT)

请查看与此相关的question和阿伦的答案。

结果:

   hadm_id rass_v
1:  100001      0
2:  100003      1
3:  100006      1
4:  100007      1
5:  100009      1
6:  100010      1
7:  100011      1

编辑:这是等效的熊猫方式:

import pandas as pd
df = pd.DataFrame({'hadmid': [100001, 100003, 100003, 100006, 100006, 100007, 100007,
                 100009, 100009, 100010, 100010, 100011, 100011],
                 'rass_v': [0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]})

df = df.groupby(['hadmid'], sort=False)['rass_v'].max()

print(df)

答案 3 :(得分:0)

我检查了一下并正确回答了。

DELETE FROM 'table_name' WHERE 'table_name'.hadm_id IN (
    select hadm_id from (
        SELECT count(hadm_id) c,
        hadm_id
        FROM 'table_name'
        GROUP BY hadm_id
        ) foo
    where foo.c = 2
    )
and rass_v=0

答案 4 :(得分:0)

您可以使用tidyverse通过分组然后按条件过滤轻松获得结果,仅保留n = 1的非0行。

df %>% 
  group_by(hadm_id) %>%
  filter((n() > 1 & rass_v != 0) | (n() == 1))

结果:

print(df)

# A tibble: 7 x 2
# Groups:   hadm_id [7]
  hadm_id rass_v
    <dbl>  <dbl>
1  100001      0
2  100003      1
3  100006      1
4  100007      1
5  100009      1
6  100010      1
7  100011      1