选择最大值

Selecting the Maximum Value of

问题:

对于一组个人 ID,数据帧中存储了六个条件(5 个二进制值和 1 个连续值)。

每个条件都可以看作是对一个特征的一次观察。每次观察到个人 ID 的二进制条件时,都会在数据框中添加一行,其中包含此人的 IDCondition 的名称(CON1、CON2、CON4、CON5、CON6)和WT 值为 1。

每次观察到连续值条件时,都会发生相同的过程,除了 Condition 值现在总是 CON3 并且 WT 值介于零和一之间。

数据框看起来像这样:

ID    Condition   WT   

29    CON1        1 
29    CON1        1 
79    CON1        1
.     .           .
.     .           .
25    CON3       .3181
5     CON3       .2316
33    CON3       .1428
47    CON3       .6651
47    CON3       .0948
47    CON3       .3839
.     .           .
.     .           .

48    CON6        1
22    CON6        1

我想生成一个新的数据框,每个人的 ID 只包含一行。我还希望每个条件都有一个单独的列,如果原始数据帧包含一个二进制条件行,那么新数据帧将把它表示为一个用于命名条件列的行。

每个人都可以在原始数据框中出现多次。如果是这种情况,我想 return 它们的非二进制值条件的最大值。

我正在尝试生成一个新的数据框,其中列出了每个唯一人员 ID 以及列(CON1 到 CON6),其中如果唯一人员 ID 确实有该条件的行,则虚拟条件列的值为 1 .连续值 CON3 应该 return 为唯一 ID 实现的最大值。

我的尝试的可重现示例:

我能够想出如何 return 一个二进制条件,但我想不出如何为每个唯一 ID 获取连续条件的最大值。

# SET SEED and Generate Data Frame

set.seed(123)

# Set # of times each binary condition is met
CON1 = 4
CON2 = 12
CON4 = 3
CON5 = 6
CON6 = 3

df <- as.data.frame(
  rbind(
    cbind( as.numeric( sample(99, CON1,  replace = T)), rep("CON1", CON1) ,  as.numeric(rep(1, CON1))),
    cbind( as.numeric( sample(99, CON2, replace = T)), rep("CON2", CON2), as.numeric(rep(1, CON2))),
    cbind( as.numeric( sample(99, 22, replace = T)), rep("CON3", 22), runif(22, min = 0, max = 1)),
    cbind( as.numeric( rep(47, 5)                 ), rep("CON3", 5) , runif(5, min = 0, max = 1)),
    cbind( as.numeric( sample(99, CON4,  replace = T)), rep("CON4", CON4) , as.numeric(rep(1, CON4))),
    cbind( as.numeric( sample(99, CON5,  replace = T)), rep("CON5", CON5) , as.numeric(rep(1, CON5))),
    cbind( as.numeric( sample(99, CON6,  replace = T)), rep("CON6", CON6) , as.numeric(rep(1, CON6)))
  )
) %>% 
  setnames(old = c("V1", "V2", "V3"), new = c("ID", "Condition", "WT"))



# Generate Results

results <- as.data.frame(
  cbind(
    "ID"   = unique(df$ID),
    "CON1" = sapply(unique(df$ID), function(x) ifelse( sum(df[df$ID == x, "Condition"] == "CON1") >=1, 1, 0)),
    "CON2" = sapply(unique(df$ID), function(x) ifelse( sum(df[df$ID == x, "Condition"] == "CON2") >=1, 1, 0)),

    # "CON3" = sapply(unique(df$ID), function(x) max(df[df$ID == x & df$Condition == "CON3", "WT"])),

    "CON4" = sapply(unique(df$ID), function(x) ifelse( sum(df[df$ID == x, "Condition"] == "CON4") >=1, 1, 0)),
    "CON5" = sapply(unique(df$ID), function(x) ifelse( sum(df[df$ID == x, "Condition"] == "CON5") >=1, 1, 0)),
    "CON6" = sapply(unique(df$ID), function(x) ifelse( sum(df[df$ID == x, "Condition"] == "CON6") >=1, 1, 0))

  )
)


# Check Sums

results %>% 
  select(CON1, CON2, CON4, CON5, CON6) %>% colSums()

我知道你想要每个个体的最大值(如果它是二元的或连续的对于最大值无关紧要)。

library(reshape2)

s1 <- df %>% group_by(ID, Condition) %>%
  summarise(value = max(as.numeric(as.character(WT))))


s1 %>% dcast(ID ~ Condition)

结果:

ID CON1 CON2       CON3 CON4 CON5 CON6
1   1   NA   NA         NA   NA    1   NA
2  11   NA    1         NA   NA   NA   NA
3  15   NA   NA 0.44220007   NA   NA   NA
4  22   NA   NA 0.37446278   NA   NA    1
5  25   NA   NA 0.31818101   NA   NA   NA
6  29    1   NA 0.04583117   NA   NA   NA
7   3   NA   NA 0.12753165   NA   NA   NA
8  33   NA   NA 0.14280002   NA   NA   NA
9  38   NA   NA         NA   NA   NA    1
10 41    1   NA         NA   NA   NA   NA
11 44   NA   NA         NA   NA    1   NA
12 45   NA    1         NA    1   NA   NA
13 46   NA    1         NA   NA   NA   NA
14 47   NA   NA 0.81464004   NA   NA   NA
15 48   NA   NA 0.75330786   NA   NA    1
16  5   NA    1 0.23162579   NA   NA   NA
17 53   NA    1         NA   NA   NA   NA
18 54   NA   NA 0.26597264   NA   NA   NA
19 55   NA    1         NA   NA   NA   NA
20 57   NA    1         NA   NA   NA   NA
21 59   NA   NA 0.85782772   NA   NA   NA
22 63   NA   NA         NA   NA    1   NA
23 64   NA   NA 0.15244475   NA   NA   NA
24 65   NA   NA 0.23303410   NA   NA   NA
25 68   NA    1         NA   NA   NA   NA
26 69   NA   NA 0.56094798   NA   NA   NA
27 71   NA   NA 0.46596245   NA    1   NA
28 75   NA   NA         NA   NA    1   NA
29 76   NA   NA 0.89504536   NA   NA   NA
30 79    1   NA 0.20653139   NA    1   NA
31 81   NA   NA         NA    1   NA   NA
32 88    1   NA         NA   NA   NA   NA
33 89   NA    1 0.41372433   NA   NA   NA
34 90   NA    1 0.12189926   NA   NA   NA
35 94   NA    1         NA   NA   NA   NA
36 95   NA    1 0.41454634   NA   NA   NA
37 96   NA   NA 0.79892485   NA   NA   NA
38 99   NA   NA 0.13880606   NA   NA   NA