合并多语言数据集r

bvuwiixz  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(194)

我有来自调查的数据框架,这些调查是用不同的语言进行的。大多数变量都是因子。每个数据框架中的因子水平都是用调查的语言表示的。我想将不同语言的数据框架合并成一个。下面是样本数据,沿着我认为需要的步骤和我遇到的问题。

最小数据

fr<-expand.grid( ques=c(factor(rep(c("oui","non"), each=2))), gender=c(factor(rep(c("femme","homme"), each=2))),chr=c(rep(c("c","g"), times=1)) )
en<-expand.grid( ques=c(factor(rep(c("yes","no"), each=2))), gender=c(factor(rep(c("man","woman"), each=2))),chr=c(rep(c("c","g"), times=1)) )
fr$chr<-as.character(fr$chr)
en$chr<-as.character(en$chr)

**第1步。**比较所有因子变量的因子水平,确保它们在不同语言中的编码相同,例如,1= yes和1= oui。我可以查看比较结果以进行评估,但我正在寻找一种有效的方法来提取数据框中所有因子变量的因子水平。
第2步如有必要,重新编码所有因素,以确保各语言之间的一致性。

levels(fr$gender)
levels(en$gender)

fr$gender <- factor(fr$gender, levels=c('homme','femme')) #reordered to match the English

步骤3.将因子变量转换为数值

fr.1<-fr %>% mutate(across(where(is.factor), as.numeric))
en.1<-en %>% mutate(across(where(is.factor), as.numeric))

步骤4.合并df

multi<-rbind.data.frame(fr.1,en.1)

第4步.重新编码为具有英语因子水平的因子我希望合并的数据框具有作为因子的变量,其水平为英语。我不确定这是否可行,也不确定如何完成这一步。

xhv8bpkk

xhv8bpkk1#

fr <- expand.grid(ques = c(factor(rep(c("oui", "non"), each = 2))), gender = c(factor(rep(c("femme", "homme"), each = 2))), chr = c(rep(c("c", "g"), times = 1)))
en <- expand.grid(ques = c(factor(rep(c("yes", "no"), each = 2))), gender = c(factor(rep(c("man", "woman"), each = 2))), chr = c(rep(c("c", "g"), times = 1)))
fr$chr <- as.character(fr$chr)
en$chr <- as.character(en$chr)

library(tidyverse)

assess_frames <- function(lang_frames){

# list the factor vars
fac_vars <- names(select(get(lang_frames[[1]]), where(is.factor)))

# print out comparisons across language frames
map(fac_vars, ~ {
  fv <- .x
  # for each language count the levels to find the max
  maxl <- map_int(
    lang_frames,
    ~ get(.x) |>
      pull(fv) |>
      levels() |>
      length()
  ) |> max()
  
  df <- data.frame(lvl = seq_len(maxl))
  # for each language add the levels to the frame
  got <- map(
    lang_frames,
    ~ {
      vlev <- get(.x) |>
        pull(fv) |>
        levels()
      if (length(vlev) < maxl) {
        # need to pad it to be longer
        num_to_add <- maxl - length(vlev)
        vlev <- c(vlev, map_chr(
          seq_len(num_to_add),
          ~ str_pad(string = "",
                    width = .x)
        ))
      }
      tibble(!!.x := vlev)
    }
  )

  bind_cols(df, got)
})
}

assess_frames(c("fr", "en"))

en$gender <- forcats::fct_relevel(en$gender,"woman")

assess_frames(c("fr", "en"))

相关问题