Определение столбца с наименьшим значением - PullRequest
0 голосов
/ 07 июня 2018

У меня есть фрейм данных, заданный следующим

DF <- structure(list(ID = c(1, 129, 169, 1087), `Collab Years Patents` = c(NA, 
"2011, 2011, 2011", "2010", "2006, 2006"), `Collab Years Publications` = c("2011", 
"2015, 2016, 2016", "2010", NA), ECP = c("2011", "2011", "2010", 
"2006")), .Names = c("ID", "Collab Years Patents", "Collab Years Publications", 
"ECP"), row.names = c(1L, 107L, 136L, 859L), class = "data.frame")

Столбец ECP - это минимальный год двух столбцов сотрудничества (который может содержать несколько лет).Мне нужен вывод, который говорит, к какой колонке принадлежит ECP.Например, решение выше могло бы быть другим вектором столбца к вышеупомянутому кадру с элементами:

    structure(list(ID = c(1, 129, 169, 1087), `Collab Years Patents` = c(NA, 
"2011, 2011, 2011", "2010", "2006, 2006"), `Collab Years Publications` = c("2011", 
"2015, 2016, 2016", "2010", NA), ECP = c("2011", "2011", "2010", 
"2006"), identifier = c("Publications", "Patents", "Both", "Patents"
)), .Names = c("ID", "Collab Years Patents", "Collab Years Publications", 
"ECP", "identifier"), row.names = c(1L, 107L, 136L, 859L), class = "data.frame")

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Использование tidyverse (dplyr и purrr):

library(tidyverse)

DF %>%
  mutate_at(2:3,strsplit,", ") %>%
  transmute(identifier = pmap(.[2:4],~c("Publications","Patents","Both")[
    2*(..3 %in% .x) + (..3 %in% .y)])) %>%
  bind_cols(DF,.)

#     ID Collab Years Patents Collab Years Publications  ECP   identifier
# 1    1                 <NA>                      2011 2011 Publications
# 2  129     2011, 2011, 2011          2015, 2016, 2016 2011      Patents
# 3  169                 2010                      2010 2010         Both
# 4 1087           2006, 2006                      <NA> 2006      Patents
0 голосов
/ 07 июня 2018

Вот опция, использующая str_detect.Перейдите по столбцам сотрудничества (sapply(DF[2:3],), используйте str_detect, чтобы проверить, какой из столбцов имеет значение «ECP».умножить на col, чтобы преобразовать значения ИСТИНА в индекс столбца, заменить элементы NA на 0, получить имена столбцов, соответствующие на основе максимального индекса столбца, удалить префиксную часть имен столбцов с sub, иприсвойте те элементы в «m1», которые больше 0, т.е. имеют «ECP» в обоих значениях «Both» в созданном векторе «v1»

library(stringr)
m1 <- col(DF[2:3]) *sapply(DF[2:3], function(x) str_detect(x, DF$ECP))
m1[is.na(m1)] <- 0
v1 <- sub(".*\\s(\\w+)$", "\\1", names(DF)[2:3][max.col(m1)])
v1[rowSums(m1 > 0) ==2] <- "Both"
DF$identifier <- v1
DF$identifier
#[1] "Publications" "Patents"      "Both"         "Patents"   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...