我有一个很大的数据集,它被分解为不同的区域。当来自给定区域的所有样本都高于给定阈值时,我想进行标记。如果给定区域的所有样本都高于给定阈值,我需要在单独的列中分配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
中的all
Value
是否为>=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]