Запрос доли определенного элемента в списке - PullRequest
1 голос
/ 02 октября 2019

У меня есть data.table следующим образом:

library(data.table)  
DT <- fread(
    "A   B  C  D  E  F  iso   year   
     0   A   1   1  NA  NA  NLD   2009   
     1   Y   0   2  NA  NA  NLD   2009   
     0   Q   1   3  NA  NA  AUS   2011   
     1   NA  0   4  NA  NA  AUS   2011   
     0   0   1   7  NA  NA  NLD   2008   
     1   1   1   1  NA  NA  NLD   2008   
     0   1   1   3  NA  NA  AUS   2012   
     0   NA  1   NA  1  NA  ECU   2009   
     1   NA  0   NA  2  0   ECU   2009   
     0   NA  0   NA  3  0   BRA   2011   
     1   NA  0   NA  4  0   BRA   2011   
     0   NA  1   NA  7  NA  ECU   2008   
     1   NA  0   NA  1  0   ECU   2008   
     0   NA  0   NA  3  2   BRA   2012   
     1   NA  0   NA  4  NA  BRA   2012",
   header = TRUE
)
DT[, C1 := list(list(C)), by = iso] 

Теперь я хотел бы проверить, превышает ли доля 1 для каждой строки в созданном столбце C1 50%.

Как бы я поступил так?

Желаемый результат:

DT <- fread(
        "A   B  C  D  E  F  iso   year      C1   Outcome
         0   A   1   1  NA  NA  NLD   2009  c(1,0,1,1) 1 
         1   Y   0   2  NA  NA  NLD   2009  c(1,0,1,1) 1 
         0   Q   1   3  NA  NA  AUS   2011  c(1,0,1)   1 
         1   NA  0   4  NA  NA  AUS   2011  c(1,0,1)   1 
         0   0   1   7  NA  NA  NLD   2008  c(1,0,1,1) 1 
         1   1   1   1  NA  NA  NLD   2008  c(1,0,1,1) 1 
         0   1   1   3  NA  NA  AUS   2012  c(1,0,1)   1 
         0   NA  1   NA  1  NA  ECU   2009  c(1,0,1,0) 0 
         1   NA  0   NA  2  0   ECU   2009  c(1,0,1,0) 0 
         0   NA  0   NA  3  0   BRA   2011  c(0,0,0,0) 0 
         1   NA  0   NA  4  0   BRA   2011  c(0,0,0,0) 0 
         0   NA  1   NA  7  NA  ECU   2008  c(1,0,1,0) 0 
         1   NA  0   NA  1  0   ECU   2008  c(1,0,1,0) 0 
         0   NA  0   NA  3  2   BRA   2012  c(0,0,0,0) 0 
         1   NA  0   NA  4  NA  BRA   2012  c(0,0,0,0) 0",
       header = TRUE
    )

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

Мы можем взять mean для каждого элемента в C1, чтобы получить соотношение 1, сравнить его с 0,5 и присвоить значения новому столбцу outcome.

DT$outcome <- +(sapply(DT$C1, mean) > 0.5)

DT
#    A    B C  D  E  F iso year      C1 outcome
# 1: 0    A 1  1 NA NA NLD 2009 1,0,1,1       1
# 2: 1    Y 0  2 NA NA NLD 2009 1,0,1,1       1
# 3: 0    Q 1  3 NA NA AUS 2011   1,0,1       1
# 4: 1 <NA> 0  4 NA NA AUS 2011   1,0,1       1
# 5: 0    0 1  7 NA NA NLD 2008 1,0,1,1       1
# 6: 1    1 1  1 NA NA NLD 2008 1,0,1,1       1
# 7: 0    1 1  3 NA NA AUS 2012   1,0,1       1
# 8: 0 <NA> 1 NA  1 NA ECU 2009 1,0,1,0       0
# 9: 1 <NA> 0 NA  2  0 ECU 2009 1,0,1,0       0
#10: 0 <NA> 0 NA  3  0 BRA 2011 0,0,0,0       0
#11: 1 <NA> 0 NA  4  0 BRA 2011 0,0,0,0       0
#12: 0 <NA> 1 NA  7 NA ECU 2008 1,0,1,0       0
#13: 1 <NA> 0 NA  1  0 ECU 2008 1,0,1,0       0
#14: 0 <NA> 0 NA  3  2 BRA 2012 0,0,0,0       0
#15: 1 <NA> 0 NA  4 NA BRA 2012 0,0,0,0       0
0 голосов
/ 02 октября 2019

Поскольку это data.table, мы можем использовать data.table методы

DT[, outcome := unlist(lapply(C1, mean))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...