Возврат значения из группы столбцов на основе местоположения другого столбца - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь извлечь значение из группы столбцов на основе другого столбца.Прохождение по первой строке для примера: -Введите значение CodeToMatch = 1 -Поиск по столбцам: Code.1, Code.2, Code.3, чтобы найти, где находится значение 1.В этом случае он находится в 3-м столбце, поэтому возвращает значение 3-го столбца из pCode.1, pCode.2, pCode3, то есть "p4"

Столбец expected_outcome вмой пример ниже показывает, что я ищу.

Любая помощь очень ценится!

c1 <- c("1","2","3")
c2 <- c("8","1","3")
c3 <- c("4","2","4")
c4 <- c("1","3","5")
c5 <- c("p1","p2","p3")
c6 <- c("p8","p1","p3")
c7 <- c("p4","p2","p4")
c8 <- c("p4","p1","p3")
df <- data.frame(c1,c2,c3,c4,c5,c6,c7,c8)
colnames(df)[c(1:8)] <- c("CodeToMatch","Code.1","Code.2","Code.3","pCode.1","pCode.2","pCode.3","expected_output")

Ответы [ 3 ]

3 голосов
/ 12 марта 2019

data.table solution

пример данных

df <- structure(list(CodeToMatch = structure(1:3, .Label = c("1", "2", 
"3"), class = "factor"), Code.1 = structure(c(3L, 1L, 2L), .Label = c("1", 
"3", "8"), class = "factor"), Code.2 = structure(c(2L, 1L, 2L
), .Label = c("2", "4"), class = "factor"), Code.3 = structure(1:3, .Label = c("1", 
"3", "5"), class = "factor"), pCode.1 = structure(1:3, .Label = c("p1", 
"p2", "p3"), class = "factor"), pCode.2 = structure(c(3L, 1L, 
2L), .Label = c("p1", "p3", "p8"), class = "factor"), pCode.3 = structure(c(2L, 
1L, 2L), .Label = c("p2", "p4"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))

код

library(data.table)
#first, melt wide table to long format
df.melt <- melt( setDT(df), id.vars="CodeToMatch", measure.vars = patterns(Code="^Code\\..*", pCode="^pCode.*"))
#now finding everything is easy...
df.melt[ Code == CodeToMatch, .(CodeToMatch, pCode)]

выход

#    CodeToMatch pCode
# 1:           3    p3
# 2:           2    p1
# 3:           1    p4
0 голосов
/ 12 марта 2019

Разделите столбцы кода и pCode на основе шаблона в именах. Найдите индекс CodeToMatch, который лежит в code_columns для каждой строки, и извлеките из него соответствующий pcode_columns, используя mapply.

code_columns <- grep("^Code\\.[0-9]+", names(df))
pcode_columns <- grep("^pCode", names(df))

mapply(function(x, y) df[x, pcode_columns][df[x, code_columns]==y],
                       1:nrow(df), df$CodeToMatch)

#[1] "p4" "p1" "p3"

Ран

df[1:4] <- lapply(df[1:4], function(x) as.numeric(as.character(x)))

чтобы сохранить числовые столбцы как числовые, а не как множители.

0 голосов
/ 12 марта 2019

Я понятия не имею, насколько хорошо это обобщается, но здесь есть опция

nCode <- 3
df$expected_output <- apply(df, 1, function(x) x[nCode + 1 + which(x[2:(nCode + 1)] == x[1])])
df$expected_output
#[1] "p4" "p1" "p3"

Обратите внимание, что количество столбцов "кода" жестко закодировано.В вашем случае у вас есть 3 "Code" столбцы с соответствующими "pCode" столбцами.Отрегулируйте по необходимости.Это также предполагает, что первый столбец всегда содержит соответствующие номера кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...