问题:
对于一组个人ID,数据框中存储了六个条件(5个二进制值和1个连续值)。
每种情况都可以被认为是对特征的单一遵守。每次观察到个人ID的二进制条件时,都会在数据框中添加一行ID
,Condition
的名称(CON1,CON2,CON4,CON5) ,CON6)和WT
值为1.
每次观察到连续值条件时,都会发生相同的过程,但Condition
值现在始终为CON3
且WT
值介于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()
答案 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