2017-01-05 2 views
2

У меня есть набор данных из 600 000 научных статей с 2012 года и 600 000 с 2014 года. Я использую пары статей (2014-2012) как свою единицу анализа, для анализа цитат и т. П.Условная выборка на основе значения столбца

У меня есть список всех статей с ссылкой на цитату (с 2014 года по 2012 год), и я хочу, чтобы каждый раз, когда 2014-doc цитирует 2012-doc (Cit = 1), элемент управления с еще одним 2012-документом, который не цитируется этим документом 2014 года, но который исходит из того же журнала, что и оригинал.

Игрушка пример:

Citing <- data.frame(T2012=c("DOI1", "DOI2", "DOI3"), 
        S2014=c("DOIa", "DOIb", "DOIc"), 
        journal2012=c("Nature", "Science", "JoE"), 
        cit=c(1,1,1)) 


Docs2012 <- data.frame(T2012=c("DOI1", "DOI2", "DOI3", "DOI4", "DOI5", "DOI6", 
           "DOI7", "DOI8", "DOI9", "DOI10", "DOI11", "DOI12", 
           "DOI13"), 
         Journal=c("Nature", "Science", "JoE", "Nature", "Nature", 
           "JoE", "Science", "JoE", "Nature", "Science", 
           "Science", "JoE", "Science")) 

... Теперь я хочу добавить 3 строки для каждого Cit = 1, где S2014 и journal2012 остаются теми же, Cit = 0 и T2012 является случайным DOI из того же журнал как Cit = 1-case выше. Я попробовал сложные циклы, чтобы нарисовать T2012, но они будут занимать несколько дней, учитывая размер моего набора данных. Это то, что я хочу, чтобы в конечном итоге с:

Citing_withcontrol <- data.frame(T2012=c("DOI1", "DOI5", "DOI4", "DOI9", "DOI2", 
             "DOI13", "DOI7", "DOI11", "DOI3", "DOI8", 
             "DOI6", "DOI12"), 
           S2014=c("DOIa", "DOIa", "DOIa", "DOIa", 
             "DOIb", "DOIb", "DOIb", "DOIb", 
             "DOIc", "DOIc", "DOIc", "DOIc"), 
           journal2012=c("Nature", "Nature", "Nature", 
               "Nature", "Science", "Science", 
               "Science", "Science", "JoE", "JoE", 
               "JoE", "JoE"), 
           cit=c(1,0,0,0,1,0,0,0,1,0,0,0)) 

Помощь больш была бы оценена

ответ

1

Одна идея использования dplyr,

library(dplyr) 
merge(Docs2012 ,Citing, by.x = c('T2012', 'Journal'), by.y = c('T2012', 'journal2012'), all = TRUE)%>% 
    arrange(Journal, S2014) %>% 
    group_by(Journal) %>% 
    mutate(S2014 = zoo::na.locf(S2014), cit = replace(cit, is.na(cit), 0)) %>% 
    sample_n(4) %>% 
    arrange(S2014, Journal, desc(cit)) %>% 
    ungroup() 

# A tibble: 12 × 4 
# T2012 S2014 Journal cit 
# <fctr> <fctr> <fctr> <dbl> 
#1 DOI1 DOIa Nature  1 
#2 DOI4 DOIa Nature  0 
#3 DOI5 DOIa Nature  0 
#4 DOI9 DOIa Nature  0 
#5 DOI2 DOIb Science  1 
#6 DOI10 DOIb Science  0 
#7 DOI7 DOIb Science  0 
#8 DOI11 DOIb Science  0 
#9 DOI3 DOIc  JoE  1 
#10 DOI12 DOIc  JoE  0 
#11 DOI6 DOIc  JoE  0 
#12 DOI8 DOIc  JoE  0 

Объяснение

  • Мы первые merge два кадра данных на столбцах T2012 & Journal/journal2012
  • Мы отсортировать полученный кадр данных на Journal & S2014 и group_by Journal.
  • Ведет последний не-NA значение вперед (с использованием zoo::na.locf) для S2014 переменных, и заменить все NA с 0 в cit переменном.
  • Мы используем sample_n взять наши образцы (4 в вашем случае)
  • We arrange и ungroup, чтобы получить требуемый выход
Смежные вопросы