截断数据框级别-tidyverse(Stringr,Haven)

时间:2019-03-12 13:47:24

标签: r tidyverse stringr

我有一个数据框,其中包含来自在线调查平台的问卷调查数据。我正在尝试使用tidyverse的haven::write_sav()将此数据帧的一部分写入SPSS文件,但是我遇到了一些数据争用问题,这些问题正困扰着数据。

问题是,SPSS仅允许小于120个字符的可变级别。我的变量级别超过了此限制,这使我无法使用数据帧写入*.sav文件。

所以我的想法是将每个数据框列的每个出现的级别截断为<= 120个字符,以确保写入过程不会中断,但是我不知道如何操作所有列的所有级别。

我正在提取这样的水平:

df %>%
    lapply(levels)

但是此后,我只是迷失了如何处理返回的列表,特别是因为该列表的大多数元素根本没有任何级别(并且使用lapply分配了NULL)。

我已经尝试过类似的方法,但是随后haven::write_sav()仅将“ 1”而不是每个变量的实际值写入SPSS电子表格:

df <- df %>%
          as.matrix()    %>%
          str_trunc(120) %>%
          as.data.frame()

haven::write_sav(df, "test.sav")

如果可能的话,我正在寻找一种解决该问题的方法,我们将不胜感激!

1 个答案:

答案 0 :(得分:1)

我们可以使用应用于所有列(strtrim)的base Rmutate_all

library(dplyr)
n <- 120
df %>%
   mutate_all(strtrim, width = n)

在OP的原始代码中,as.data.frame默认将其转换为带有data.frame列的character(除非指定,stringsAsFactors = TRUE)为factor s与stringsAsFactors = FALSE