R условный расчет для переменных - PullRequest
1 голос
/ 07 января 2020

Я пытаюсь создать условную сумму для каждой строки в моем фрейме данных в соответствии с двумя различными объектами списков. Идея состоит в том, чтобы проверить значение строки / значения (некоторые из них являются списком объектов) и назначить 1 или -1 для каждого значения / значения и найти сумму для него / них.

Например; df строка 7 имеет c("cuneytozdemir", "ahmethc", "fatihportakal"), как это и боковое значение этой строки должно быть 1 из-за этого cuneytozdemir: 1, ahmethc: -1, fatihportakal:1

Я пробовал этот код, и я получил результаты только для одного значения, и я не получил ни одного значение для объекта списка.

df_side <- df %>%
  mutate(side= case_when(
    mentions %in% unlist(J_Con) ~ 1,
    mentions %in% unlist(J_Pro) ~ -1)) 

Пример кадра данных здесь:

df <- structure(list(screen_name = c("N_bingol", "SAliakman", "TC_SelimCandas", 
                                     "deniyeciz", "batuozcn", "dst_cemal", "kentineiyibak", "GokhanMHP", 
                                     "GokhanMHP", "ramadanmeletli"), 
                     mentions = list(c("turgayguler","mecertas", "yasingorgulu28", "Atasehirakgenc", "SAliakman"),
                                     c("N_bingol", "turgayguler", "mecertas", "yasingorgulu28","Atasehirakgenc", "SAliakman"), 
                                     c("MesutKokten", "ahmethc","MHP_Bilgi"), "ahmethc", 
                                     c("tevfik_uygur", "turgayguler"),"hikmetgenc", 
                                     c("cuneytozdemir", "ahmethc", "fatihportakal"), "ahmethc", "ahmethc", 
                                     c("GokhanMHP", "ahmethc"))), 
                row.names = c("11355","11383", "68592", "228341", "354369", "358484", "359043", "371744","371753", "372216"), 
                class = "data.frame")

Здесь находятся J_Con и J_Pro:

J_Con <- structure(c(17L, 26L, 31L, 38L, 61L, 10L, 68L, 13L, 24L, 41L, 
                     48L, 56L, 49L, 22L, 25L, 52L, 39L, 5L, 9L, 33L, 69L, 73L, 66L, 
                     28L, 55L, 8L, 1L, 74L, 47L, 70L, 20L, 4L, 32L, 16L, 65L, 6L, 
                     14L, 21L, 63L, 43L, 53L, 57L, 15L, 36L, 7L, 37L, 50L, 54L, 12L), 
                   .Label = c("acikcenk", "ahmetay_", "ahmethc", "akdemircigdem", 
              "amberinzaman", "arzuyldzz", "asliaydintasbas", "AtillaSertell", 
              "banuguven", "barisyarkadas", "bekiservet", "cakir_rusen", "candundaradasi", 
              "cengizalgan", "ceydak", "cuneytozdemir", "degirmencirfan", "denizyildirim79", 
              "doganburak29", "dunya20101", "efekerem", "emrkongar", "EremSenturk", 
              "erenerdemnet", "ETemelkuran", "fatihportakal", "fatihtezcan", 
              "gokhanozbek", "haciykk", "hakanchelik", "Halitisci", "HasanCucuk", 
              "haykobagdat", "hikmetgenc", "hilal_kaplan", "imambakirukus", 
              "iremafsin", "ismaildukel", "ismailsaymaz", "kenan_kiran", "KucukkayaIsmail", 
              "mahmutovur", "MaliGuller", "Malikejder47", "MehToprak", "melihaltinok", 
              "merdanyanardag", "mkirikkanat", "mustafabalbay", "mustafahos", 
              "nevzatcicek", "nihatsirdar", "NuranWolf", "ozge_mumcu", "ozgurmumcu", 
              "RuhatMengi34", "s_hablemitoglu", "samiltayyar27", "Sarikli_Voyvoda", 
              "sarseven", "SedefKabas", "sevilayyaziyor", "siring", "slymnoz", 
              "TaylanKulacogIu", "Tuluhantekeli", "turgayguler", "ugurdundarsozcu", 
              "unsalunlu", "utkucakirozer", "veyisates", "yenisafakwriter", 
              "yvzah", "YZGLLDGN", "zihnicakir"), class = "factor")

J_Pro <- structure(c(67L, 27L, 11L, 40L, 75L, 34L, 3L, 44L, 64L, 72L, 
                     35L, 58L, 60L, 71L, 18L, 62L, 19L, 46L, 51L, 2L, 23L, 29L, 30L, 
                     42L, 59L, 45L), 
                   .Label = c("acikcenk", "ahmetay_", "ahmethc","akdemircigdem", "amberinzaman", 
                  "arzuyldzz", "asliaydintasbas","AtillaSertell", "banuguven", "barisyarkadas", 
                  "bekiservet","cakir_rusen", "candundaradasi", "cengizalgan", "ceydak", "cuneytozdemir", 
                  "degirmencirfan", "denizyildirim79", "doganburak29", "dunya20101", 
                  "efekerem", "emrkongar", "EremSenturk", "erenerdemnet", "ETemelkuran", 
                  "fatihportakal", "fatihtezcan", "gokhanozbek", "haciykk", "hakanchelik", 
                  "Halitisci", "HasanCucuk", "haykobagdat", "hikmetgenc", "hilal_kaplan", 
                  "imambakirukus", "iremafsin", "ismaildukel", "ismailsaymaz", 
                  "kenan_kiran", "KucukkayaIsmail", "mahmutovur", "MaliGuller", 
                  "Malikejder47", "MehToprak", "melihaltinok", "merdanyanardag", 
                 "mkirikkanat", "mustafabalbay", "mustafahos", "nevzatcicek", 
                 "nihatsirdar", "NuranWolf", "ozge_mumcu", "ozgurmumcu", "RuhatMengi34", 
                 "s_hablemitoglu", "samiltayyar27", "Sarikli_Voyvoda", "sarseven", 
                 "SedefKabas", "sevilayyaziyor", "siring", "slymnoz", "TaylanKulacogIu", 
                 "Tuluhantekeli", "turgayguler", "ugurdundarsozcu", "unsalunlu", 
                 "utkucakirozer", "veyisates", "yenisafakwriter", "yvzah", "YZGLLDGN", 
                 "zihnicakir"), class = "factor")

1 Ответ

2 голосов
/ 07 января 2020

Читая ваш вопрос и код, мне кажется, что вы хотите сделать что-то вроде следующего. Вы взяли строку 7 в качестве примера. Вы пытались проверить, отображается ли каждое имя в этой строке в J_pro или J_Con. Если имя отображается в J_Con, присвойте 1 имя. Если имя отображается в J_Pro, присвойте имя -1. В противном случае присвойте 0 имени. Я думаю, что вы пытались сделать это в своем коде. Затем для каждой строки вы хотите суммировать значения из обеих логических проверок.

Учитывая, что сначала я создал групповую переменную с именем id, затем преобразовал данные в данные длинного формата. Я создал две колонки для логической проверки. Затем я подытожил две колонки. Наконец, я удалил столбцы. Если вам нужно дополнительно агрегировать данные по screen_name, вам нужно еще одно group_by + суммировать

library(dplyr)
library(tidyr)
library(purrr)

# Check if there is any overlapping between the two.
intersect(J_Pro, J_Con)

group_by(df, id = 1:n()) %>% 
unnest_longer(mentions) %>% 
mutate(check_con = if_else(mentions %in% J_Con, 1, 0),
       check_pro = if_else(mentions %in% J_Pro, -1, 0)) %>% 
summarize(screen_name = first(screen_name),
          res = sum(check_con) + sum(check_pro)) %>% 
select(-contains("check")) 

#      id screen_name      res
#   <int> <chr>          <dbl>
# 1     1 N_bingol          -1
# 2     2 SAliakman         -1
# 3     3 TC_SelimCandas    -1
# 4     4 deniyeciz         -1
# 5     5 batuozcn          -1
# 6     6 dst_cemal         -1
# 7     7 kentineiyibak      1
# 8     8 GokhanMHP         -1
# 9     9 GokhanMHP         -1
#10    10 ramadanmeletli    -1

Другая идея заключается в следующем. Для каждого списка в mentions создайте вектор символов, используя unlist(), выполните логическую проверку и суммируйте значения. Этот процесс выполняется дважды (один для J_con и другой для J_Pro). Возвращаемое значение собирается в каждой строке res.

mutate(df,
       res = map(.x = mentions,
                 .f = function(x) {sum(if_else(unlist(x) %in% J_Con, 1, 0)) +
                                   sum(if_else(unlist(x) %in% J_Pro, -1, 0))}))

#     screen_name                                                                   mentions res
#1        N_bingol           turgayguler, mecertas, yasingorgulu28, Atasehirakgenc, SAliakman  -1
#2       SAliakman N_bingol, turgayguler, mecertas, yasingorgulu28, Atasehirakgenc, SAliakman  -1
#3  TC_SelimCandas                                            MesutKokten, ahmethc, MHP_Bilgi  -1
#4       deniyeciz                                                                    ahmethc  -1
#5        batuozcn                                                  tevfik_uygur, turgayguler  -1
#6       dst_cemal                                                                 hikmetgenc  -1
#7   kentineiyibak                                      cuneytozdemir, ahmethc, fatihportakal   1
#8       GokhanMHP                                                                    ahmethc  -1
#9       GokhanMHP                                                                    ahmethc  -1
#10 ramadanmeletli                                                         GokhanMHP, ahmethc  -1
...