Мутирующие образцы, когда вся группа соответствует условию - PullRequest
0 голосов
/ 04 мая 2020

У меня есть большой набор данных, который разбит на различные зоны. Я хотел бы отметить, когда все сэмплы из данной зоны превышают заданный порог. Если все выборки для данной Зоны выше заданного порога, мне нужно назначить 1 Значение в отдельном столбце (и назначить 2 Значение, если не все выборки в данной Зоне выше заданного порога).

Я понимаю, что могу использовать функцию group_by в dplyr, чтобы назначать зоны группам, и что мне по сути нужно преобразовать данные в новый столбец, но не знаю, как назначить правило, которое зависит от всех выборок. от группы, отвечающей определенному условию (в данном случае превышающему заданный порог). Ниже приведен пример фрейма данных с пороговым значением 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 имеют New. Значения 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

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Используя dplyr, мы можем проверить, является ли all Value >=1 в каждом Zone и присвоить значение соответственно.

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]) 
1 голос
/ 04 мая 2020

Вот пример использования 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...