Как я могу сделать эту стандартную операцию Excel в R? - PullRequest
1 голос
/ 11 июня 2019

Я хочу определить, кто является дефолтным и добровольным участником в базе данных страхования.Членами по умолчанию являются члены с определенным количеством единиц в зависимости от их возраста.Добровольные участники - это любые участники, у которых в этом возрасте больше единиц, чем членов по умолчанию.

Я хочу создать в R столбец с надписью "По умолчанию" или "Добровольный"

У меня есть таблицаколичество единиц, которое имеет член по умолчанию.Например:

Age Units
18  2
19  2
20  2
21  2
22  2
23  2
24  2
25  3
26  3
27  3
28  3
29  3
30  3
31  4
32  4
33  4
34  4
35  4
36  4
37  4
38  4
39  4
40  4
41  4
42  4
43  4
44  4
45  4
46  4
47  4
48  4
49  4
50  3
51  3
52  3
53  3
54  3
55  3
56  3
57  3
58  3
59  3
60  2
61  2
62  2
63  2
64  2
65  1
66  1
67  1
68  1
69  1

Обычно я делаю это в Excel, просматривая количество единиц в элементе, и если оно равно количеству единиц по умолчанию из таблицы выше, я бы сказал, что они стандартные, а если нет, топо умолчанию.

Это то, что я хотел бы достичь в Excel

if( MembersUnits = vlookup(memberage,defaultunitstable,2,0),"Default", "Voluntary")

Я ожидаю, что будет "По умолчанию" или "Добровольно"

Ответы [ 2 ]

0 голосов
/ 12 июня 2019
if (!require("prodlim")) {
  install.packages("prodlim")
  require("prodlim")
} # ensure installation and loading of package "prodlim"

ifelse(is.na(row.match(as.data.frame(dat), as.data.frame(lookup))),
       "Voluntary", 
       "Default")
## [1] "Default"   "Voluntary" "Voluntary" "Default"   "Default"   "Default" 

## the function
## prodlim::row.match(as.data.frame(dat), as.data.frame(lookup))
## returns for each row in dat,
##    the matching row number in lookup or 
##    NA if there is no match
## 
## This resulting vector one can use to translate any non-NA to "Default" and
## any NA to "Voluntary" using the vectorized `ifelse`

А, я использовал в качестве примера следующие данные @Paul:

require(dplyr)
dat <- tibble(Age = c(50, 50, 49, 26, 32, 18), Units = c(3, 5, 5, 3, 4, 2))
lookup <- structure(list(Age = 18:69,
                         Units = c(2L, 2L, 2L, 2L, 2L, 2L, 
                                   2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
                                   4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 
                                   3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L)),
                    row.names = c(NA, 
                                  -52L), class = c("tbl_df", "tbl", "data.frame"))
0 голосов
/ 11 июня 2019

Используя данные, которые вы указали в виде таблицы lookup, я создал данные о возрасте человека и количестве единиц, которые он имеет, соединил пороговые значения с lookup и сравнил значения с ifelse:

library(dplyr)

lookup <- structure(list(Age = 18:69,
                         Units = c(2L, 2L, 2L, 2L, 2L, 2L, 
                                   2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
                                   4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 
                                   3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L)),
                    row.names = c(NA, 
                                  -52L), class = c("tbl_df", "tbl", "data.frame"))

dat <- tibble(Age = c(50, 50, 49, 32, 18), Units = c(3, 5, 5, 4, 3))

left_join(dat, rename(lookup, "Threshold" = "Units"), by = "Age") %>%
  mutate(member = ifelse(Units == Threshold, "Default", "Voluntary"))

# A tibble: 5 x 4
    Age Units Threshold member   
  <dbl> <dbl>     <int> <chr>    
1    50     3         3 Default  
2    50     5         3 Voluntary
3    49     5         4 Voluntary
4    32     4         4 Default  
5    18     3         2 Voluntary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...