基于变量名子集数据?
Subsetting data based on variable name?
我在 R 中工作。我有一个大型数据集(超过 700 'Name'),其中一个子集如下所示:
Name Value
Harris 64
Harris 78
Harris 4
Jackson 102
Jackson 170
Drew 75
Smith 143
Smith 38
我想编写一个函数,根据我的一组限制,将每个 'Name' 的值标记为异常值:
Name Limit
Harris 0 - 70
Jackson 0 - 150
Drew 0 - 80
Smith 0 - 70
我想根据限制说,如果有任何值超出它们,则生成一个新的 table 将这些值标记为异常值。我想这是一个新列,其中 'TRUE' 表示离群值,示例如下:
Name Value Outlier
Harris 64 FALSE
Harris 78 TRUE
Harris 4 FALSE
Jackson 102 FALSE
Jackson 170 TRUE
Drew 75 FALSE
Smith 143 TRUE
Smith 38 FALSE
如果我只用一个 'Name' 来做到这一点,我会使用 subset
函数,但是由于我有多个名称必须符合我的限制,所以我不确定在哪里开始。
如果您使用 "Name"
以及限制的最小值和最大值创建限制 table,您可以对其执行 left_join
,然后使用 [=14= 检查异常值].
library(dplyr)
df %>%
left_join(limits, by = "Name") %>%
mutate(Outlier = !data.table::between(Value, min, max))
# Name Value min max Outlier
#1 Harris 64 0 70 FALSE
#2 Harris 78 0 70 TRUE
#3 Harris 4 0 70 FALSE
#4 Jackson 102 0 150 FALSE
#5 Jackson 170 0 150 TRUE
#6 Drew 75 0 80 FALSE
#7 Smith 143 0 70 TRUE
#8 Smith 38 0 70 FALSE
如果不需要,您可以稍后删除 min
和 max
列。
数据
df <- structure(list(Name = structure(c(2L, 2L, 2L, 3L, 3L, 1L, 4L,
4L), .Label = c("Drew", "Harris", "Jackson", "Smith"), class = "factor"),
Value = c(64L, 78L, 4L, 102L, 170L, 75L, 143L, 38L)),
class = "data.frame", row.names = c(NA, -8L))
limits <- structure(list(Name = structure(c(2L, 3L, 1L, 4L), .Label = c("Drew",
"Harris", "Jackson", "Smith"), class = "factor"), min = c(0L,
0L, 0L, 0L), max = c(70L, 150L, 80L, 70L)), class = "data.frame",
row.names = c(NA, -4L))
我在 R 中工作。我有一个大型数据集(超过 700 'Name'),其中一个子集如下所示:
Name Value
Harris 64
Harris 78
Harris 4
Jackson 102
Jackson 170
Drew 75
Smith 143
Smith 38
我想编写一个函数,根据我的一组限制,将每个 'Name' 的值标记为异常值:
Name Limit
Harris 0 - 70
Jackson 0 - 150
Drew 0 - 80
Smith 0 - 70
我想根据限制说,如果有任何值超出它们,则生成一个新的 table 将这些值标记为异常值。我想这是一个新列,其中 'TRUE' 表示离群值,示例如下:
Name Value Outlier
Harris 64 FALSE
Harris 78 TRUE
Harris 4 FALSE
Jackson 102 FALSE
Jackson 170 TRUE
Drew 75 FALSE
Smith 143 TRUE
Smith 38 FALSE
如果我只用一个 'Name' 来做到这一点,我会使用 subset
函数,但是由于我有多个名称必须符合我的限制,所以我不确定在哪里开始。
如果您使用 "Name"
以及限制的最小值和最大值创建限制 table,您可以对其执行 left_join
,然后使用 [=14= 检查异常值].
library(dplyr)
df %>%
left_join(limits, by = "Name") %>%
mutate(Outlier = !data.table::between(Value, min, max))
# Name Value min max Outlier
#1 Harris 64 0 70 FALSE
#2 Harris 78 0 70 TRUE
#3 Harris 4 0 70 FALSE
#4 Jackson 102 0 150 FALSE
#5 Jackson 170 0 150 TRUE
#6 Drew 75 0 80 FALSE
#7 Smith 143 0 70 TRUE
#8 Smith 38 0 70 FALSE
如果不需要,您可以稍后删除 min
和 max
列。
数据
df <- structure(list(Name = structure(c(2L, 2L, 2L, 3L, 3L, 1L, 4L,
4L), .Label = c("Drew", "Harris", "Jackson", "Smith"), class = "factor"),
Value = c(64L, 78L, 4L, 102L, 170L, 75L, 143L, 38L)),
class = "data.frame", row.names = c(NA, -8L))
limits <- structure(list(Name = structure(c(2L, 3L, 1L, 4L), .Label = c("Drew",
"Harris", "Jackson", "Smith"), class = "factor"), min = c(0L,
0L, 0L, 0L), max = c(70L, 150L, 80L, 70L)), class = "data.frame",
row.names = c(NA, -4L))