вернуть имя столбца, когда значение выше порога - PullRequest
1 голос
/ 09 февраля 2020

Это продолжение предыдущего вопроса: Возвращает имя столбца для максимальной функции

ethnic <- c("white", "black", "hispanic", "asian", "other")
ethnicity$ethnicity  <- ethnic[max.col(ethnicity[ethnic], 'first')]

Этот код возвращает этническую принадлежность каждого человека на основе этни c категория с самой высокой долей. Это здорово.

Однако я хочу сделать еще один шаг вперед. Вместо того, чтобы возвращать этни c группу с наивысшей долей, я хочу, чтобы этни c группа вернула более 0,8. Разница в том, что если категория ethni c с наибольшим (максимальным) соотношением ниже 0,8, возвращается «Нет совпадения».

Например,

John:
white  black  hispanic  asian  other
0.5.   0.2    0.1       0.2    0.0

Это должно вернуть Нет совпадений .

Jack:
white  black  hispanic  asian  other
0.8    0.1    0.0       0.1    0.0

Это должно вернуть Белый .

Вот воспроизводимый образец с использованием dput():

ethnicity <- structure(list(year = c(2010L, 2013L, 2009L, 2014L, 2001L), property = c("6446 025", 
"6710 034", "0525 065", "0272 006", "1720 030"), address = c("1147 NAPLES ST", 
"73 MIZPAH ST", "43 ESTATES CT", "650 BUSH ST", ""), city = c("SAN FRANCISCO CA", 
"SAN FRANCISCO CA", "SAN RAFAEL CA", "SAN FRANCISCO CA", ""), 
    city_overflow = c("", "", "", "", ""), zip = c("94112", "94131", 
    "94901", "94108", ""), surname = c("DELEON", "HENDERSON", 
    "KOORHAN", "EXECUTIVE", "WONG"), name = c("ESTELA", "DANIEL", 
    "GLENN", "HOTEL", "CHUN"), middle = c(NA, "V ", "S", "VINTAGE COURT", 
    NA), Owner2 = c("GAMEZ JUAN", " HELENE E", NA, NA, NA), Owner3 = c(NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    ), org = c(FALSE, FALSE, FALSE, FALSE, FALSE), surname.match = c("DELEON", 
    "HENDERSON", "", "", "WONG"), white = c(0.0664, 0.5963, 0.6665, 
    0.6665, 0.0348), black = c(0.0104, 0.3398, 0.0853, 0.0853, 
    0.0079), hispanic = c(0.8306, 0.0251, 0.1367, 0.1367, 0.04
    ), asian = c(0.0831, 0.0045, 0.0797, 0.0797, 0.8649), other = c(0.0095, 
    0.0342, 0.0318, 0.0318, 0.0524), ethnicity = c("hispanic", 
    "white", "white", "white", "asian")), row.names = c("1998", 
"3431", "6884", "39310", "9524"), class = "data.frame")

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020

Вот ответ с базой R.

ethnicity$ethnicity <- apply(ethnicity[14:18], 1, function(x) {
  i <- x >= 0.8
  if(any(i)) ethnic[i] else "No Match"
})
ethnicity
2 голосов
/ 09 февраля 2020

Чтобы продолжить исходное решение, я добавляю новый столбец, который имеет значение 0,8. Тогда max.col может найти индексы столбцов максимальных значений. Если максимальное значение равно 0,8, он вернет индекс «No_Match».

исходное решение

ethnic[max.col(ethnicity[ethnic], 'first')]

# [1] "hispanic" "white"    "white"    "white"    "asian"   

скорректированное решение

c(ethnic, "No_Match")[max.col(cbind(ethnicity[ethnic], 0.8), 'first')]

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