Apariția Codului cu date.table: Săptămâna Unu

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(Acest articol a fost publicat pentru prima dată pe Blogși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)


Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.

Decembrie fericit, prieteni R!

Una dintre tradițiile mele preferate în comunitatea R este Advent of Code, o serie de puzzle-uri lansate la miezul nopții EST de la 1 până la 25 decembrie, care urmează să fie rezolvate prin programare în limba pe care o alegeți. De obicei, fac câteva dintre ele în fiecare an și am încercat odată să le fac pe fiecare în momentul în care a apărut!

Anul acesta, știu că nu o voi putea face zilnic, dar voi face cât de multe pot folosind doar data.table solutii.

Îmi voi permite să folosesc alte pachete când nu există data.table echivalent, dar soluțiile mele trebuie să fie ca data.table-y posibil.

Voi abuza de structura postării blogului și voi actualiza acest fișier pe parcursul săptămânii.

1 decembrie

Prima parte

d1 <- fread("day1_dat1.txt")
d1(, V1 := sort(V1))
d1(, V2 := sort(V2))
d1(, diff := abs(V1-V2))

sum(d1$diff)

Partea a doua

d1(, similarity := sum(V1 == d1$V2)*V1, by = V1)

sum(d1$similarity)

2 decembrie

Prima parte

d1 <- fread("day2_dat1.txt", fill = TRUE)
check_report <- function(vec) {
  
  vec <- na.omit(vec)
  
  has_neg <- vec < 0
  has_pos <- vec > 0
  
  inc_dec <- sum(has_neg) == length(vec) | sum(has_pos) == length(vec)

  too_big <- max(abs(vec)) > 3
  
  return(inc_dec & !too_big)
}
d1t <- transpose(d1)
deltas <- d1t(-nrow(d1t)) - d1t(2:nrow(d1t))

res <- apply(deltas, 2, "check_report")

sum(res)

Partea a doua

test_reports <- function(dat) {

  deltas <- dat(-nrow(dat)) - dat(2:nrow(dat))

  res <- apply(deltas, 2, "check_report")

  res
}
res <- test_reports(d1t)

for (i in 1:nrow(d1t)) {
  
  res <- res | test_reports(d1t(-i,))
  
  
}

sum(res)

Doar pentru distracție

Am găsit folosirea apply profund nesatisfăcător, deși a fost rapid, așa că doar pentru distracție:

d1t <- transpose(d1)
deltas <- d1t(-nrow(d1t)) - d1t(2:nrow(d1t))

is_not_pos <- deltas <= 0
is_not_neg <- deltas >= 0
is_big <- abs(deltas) > 3

res_inc <- colSums(is_not_neg | is_big, na.rm = TRUE)

res_dec <- colSums(is_not_pos | is_big, na.rm = TRUE)

sum(res_inc == 0) + sum(res_dec == 0)

Yay. 🙂

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.