Как проверить, все ли наблюдения равны нулю в продольном наборе данных в R? - PullRequest
0 голосов
/ 13 января 2020

Для следующего набора данных я бы хотел определить sl, для которого все y являются нулями.

mydata
                    y  x  sl
        1   199.92989  1   1
        2    27.73883  2   1
        3   144.00000  3   1
        4    72.00000  4   1
        5     0.00000  5   1
        6   392.60636  1   2
        7   749.52499  2   2
        8  3120.00000  3   2
        9  1600.00000  4   2
        10 1000.00000  5   2
        11 5840.00000  6   2
        12 3960.00000  7   2
        13 4700.00000  8   2
        14 1660.00000  9   2
        15 5620.00000 10   2
        16    0.00000  1 585
        17    0.00000  2 585
        18    0.00000  3 585
        19 3062.32962  1 587
        20 2048.97458  2 587
        21 1280.00000  3 587
        22 1440.00000  4 587
        23 2960.00000  5 587
        24  460.00000  6 587
        25  530.00000  7 587
        26 5190.00000  8 587
        27 3200.00000  9 587
        28 4620.00000 10 587
        29    0.00000  1 651
        30    0.00000  2 651
        31    0.00000  3 651
        32    0.00000  4 651

Ожидаемый ответ: 585, 651. Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 13 января 2020

Вы можете использовать tapply, чтобы применить функцию к y, сгруппированную по sl

sl_y0 <- with(mydata, tapply(y, sl, function(y) all(y == 0)))
names(sl_y0)[sl_y0]     

# [1] "585" "651"

Или с помощью dplyr

library(dplyr)

mydata %>% 
  group_by(sl) %>% 
  summarise(ally_eq0 = all(y == 0)) %>% 
  filter(ally_eq0) %>% 
  pull(sl)

# [1] 585 651

Или data.table

library(data.table)
setDT(mydata)

mydata[, if(all(y == 0)) sl, sl][, sl]
# [1] 585 651
0 голосов
/ 13 января 2020

Другое базовое решение R в дополнение к tapply() от @ IceCreamToucan должно использовать split() + sapply(), т. Е.

res <- names(which(sapply(split(mydata,mydata$sl),function(v) all(v$y==0))))

, такое что

> res
[1] "585" "651"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...