library(foreign)

ess <- read.spss("ESS11_unlabeled.0-10.sav", to.data.frame = TRUE, use.value.labels = FALSE)

prt_labels <- {
  lbls <- attr(ess$prtvtffr, "value.labels")
  if (is.null(lbls)) {
    as.character(ess$prtvtffr)
  } else {
    code_to_label <- setNames(names(lbls), lbls)
    unname(code_to_label[as.character(ess$prtvtffr)])
  }
}

fr_idx <- ess$cntry == "FR"
ess_fr <- ess[fr_idx, , drop = FALSE]
prt_fr <- prt_labels[fr_idx]
prt_fr_ascii <- iconv(prt_fr, to = "ASCII//TRANSLIT", sub = "")

match <- grepl("(Rassemblement National|Front\\s*National|\\bRN\\b|Reconquete)", prt_fr_ascii, ignore.case = TRUE)
match[is.na(match)] <- FALSE

vote_rw <- as.integer(ess_fr$vote == 1 & match)

agg <- data.frame(
  n = nrow(ess_fr),
  vote_rw_share = sum(vote_rw * ess_fr$anweight, na.rm = TRUE) / sum(ess_fr$anweight, na.rm = TRUE),
  agea = weighted.mean(ess_fr$agea, ess_fr$anweight, na.rm = TRUE)
)

knitr::kable(
  agg,
  digits = 3,
  col.names = c("Sample (n)", "Right-wing vote share (weighted)", "Age (weighted mean)"),
  caption = "France (weighted)"
)
France (weighted)
Sample (n) Right-wing vote share (weighted) Age (weighted mean)
1771 0.088 48.249