选择的最大值

里克·阿科(Rick Arko)

问题:

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

可以将每个条件视为对特征的单次遵守。每次观察到用于个人ID的二进制条件时,都会向该数据帧添加带有person的行ID,其名称为Condition(CON1,CON2,CON4,CON5,CON6)和WT值1。

每次观察到连续值条件时,都会执行相同的过程,只是Condition现在值始终为零且CON3WT值介于零和一之间。

数据框看起来像这样:

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仅包含一行。我还希望为每个条件提供一个单独的列,如果原始数据帧包含用于二进制条件的行,则新数据帧将其表示为命名条件列的一个。

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

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

我的尝试的可复制示例:

我能够弄清楚如何为二进制条件返回一个,但是我想不起来如何为每个唯一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()
威特314

我了解您希望每个人都获得最大值(如果是二进制值或连续值,则最大值并不重要)。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章