当整个组满足某个条件时,突变样本

  • 本文关键字:突变 条件 样本 满足 r
  • 更新时间 :
  • 英文 :


我有一个很大的数据集,它被分解为不同的区域。当来自给定区域的所有样本都高于给定阈值时,我想进行标记。如果给定区域的所有样本都高于给定阈值,我需要在单独的列中分配1值(如果不是给定区域中的所有样本均高于给定阈值则分配2值(。

我意识到我可以使用dplyr中的group_by函数将Zones分配给组,而且我基本上需要将数据突变到一个新列,但不确定如何分配一个规则,该规则取决于满足特定条件的组中的所有样本(在这种情况下,该规则高于给定阈值(。以下是阈值为1的示例数据帧。

Zone Value
1  Zone1     1
2  Zone1     2
3  Zone1     2
4  Zone1     1
5  Zone1     2
6  Zone1     4
7  Zone2     3
8  Zone2     1
9  Zone2     2
10 Zone2     2
11 Zone2     1
12 Zone2     1
13 Zone2     2
14 Zone3     1
15 Zone3     2
16 Zone3     1
17 Zone3     0
18 Zone3     1
19 Zone3     1
20 Zone3     0
21 Zone3     0

以下是所需的输出。区域1和2具有新值。值为1,因为这些组中的所有样本都高于阈值1,整个区域3被分配为2,因为某些样本的值小于1。

Zone Value New.Value
1  Zone1     1         1
2  Zone1     2         1
3  Zone1     2         1
4  Zone1     1         1
5  Zone1     2         1
6  Zone1     4         1
7  Zone2     3         1
8  Zone2     1         1
9  Zone2     2         1
10 Zone2     2         1
11 Zone2     1         1
12 Zone2     1         1
13 Zone2     2         1
14 Zone3     1         2
15 Zone3     2         2
16 Zone3     1         2
17 Zone3     0         2
18 Zone3     1         2
19 Zone3     1         2
20 Zone3     0         2
21 Zone3     0         2

使用dplyr,我们可以检查每个Zone中的allValue是否为>=1,并相应地赋值。

library(dplyr)
df %>% group_by(Zone) %>% mutate(New_value = c(2, 1)[all(Value >= 1) + 1])
#Can also use if else. 
#df %>% group_by(Zone) %>% mutate(Value = if(all(Value >= 1)) 1 else 2)
#   Zone  Value
#   <chr> <dbl>
# 1 Zone1     1
# 2 Zone1     1
# 3 Zone1     1
# 4 Zone1     1
# 5 Zone1     1
# 6 Zone1     1
# 7 Zone2     1
# 8 Zone2     1
# 9 Zone2     1
#10 Zone2     1
# … with 11 more rows

和在基地R:

df$New_value <- with(df, c(2, 1)[ave(Value >= 1, Zone, FUN = all) + 1]) 

下面是一个使用data.table和一些伪数据的例子

# setup 
library(data.table)
set.seed(1)
dt1 <- data.table(
V1 = sample(letters[1:5], replace = TRUE, size = 15),
V2 = sample(c(1:4), replace = TRUE, size = 15))
# solution 
dt1[, V3 := all(V2>1), by = V1]

如果您的数据帧被称为df1,并且您希望其值为1或2,那么解决方案将是

setDT(df1)
df1[, New.value := sum(all(Value>1)) + 1]

最新更新