Мы можем сделать с table
с base R
. Получить столбец «Значение» в качестве логического вектора (!is.na
) и найти таблицу частот с помощью «Группы», проверить, превышает ли частота значение 0, преобразовать логический вектор в двоичный с помощью as.integer
или +
+(table(df1$Groups, !is.na(df1$Value))[,2] > 0)
# G1 G2 G3 G4 G5
# 1 0 1 0 1
Или используя rowsum
из base R
rowsum(+!is.na(df1$Value), df1$Groups)
ПРИМЕЧАНИЕ: оба вышеуказанных метода base R
- пакеты не используются
Или используя tidyverse
library(tidyverse)
df1 %>%
group_by(Groups) %>%
summarise_all(list(~ as.integer(sum(!is.na(.)) > 0)))
# A tibble: 5 x 2
# Groups Value
# <chr> <int>
#1 G1 1
#2 G2 0
#3 G3 1
#4 G4 0
#5 G5 1
или с data.table
library(data.table)
setDT(df1)[, +(sum(!is.na(Value)) > 0), Groups]
данные
df1 <- structure(list(Groups = c("G1", "G1", "G1", "G1", "G2", "G2",
"G2", "G2", "G2", "G2", "G3", "G3", "G4", "G4", "G5", "G5"),
Value = c(NA, NA, NA, 23L, NA, NA, NA, NA, NA, NA, 34L, 21L,
NA, NA, NA, 45L)), class = "data.frame", row.names = c(NA,
-16L))