选择

时间:2016-10-03 15:12:14

标签: r dataframe sapply

问题:

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

每种情况都可以被认为是对特征的单一遵守。每次观察到个人ID的二进制条件时,都会在数据框中添加一行IDCondition的名称(CON1,CON2,CON4,CON5) ,CON6)和WT值为1.

每次观察到连续值条件时,都会发生相同的过程,但Condition值现在始终为CON3WT值介于0和1之间。

数据框看起来像这样:

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()

1 个答案:

答案 0 :(得分:3)

我知道你希望每个人都有最大值(如果它是二进制或连续的,那么最大值无关紧要。)

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