【问题标题】:Trying to set factor levels for specific variables in data frame--Lapply returns NA尝试为数据框中的特定变量设置因子水平 - Lapply 返回 NA
【发布时间】:2019-08-18 11:43:01
【问题描述】:

我有调查数据,我正在尝试将具有分类数据(“强烈同意”、“同意”等)的多个变量转换为数字(“6”、“5”..),以便稍后分析它们(使用总结/平均)

我试过了:

df<-read_xlsx("Microdata_1.xlsx")
df[46:59] <- lapply(df[46:59], function(x) factor(x))   

df[46:59] <- lapply(df[46:59], factor, levels=c(6,1,4,3,5,2))

df[46:59] <- lapply(df[46:59], function(x) as.numeric(as.character(x)))

但它返回一个 NAs 矩阵

prob33 prob34 prob35 prob36 prob37 prob38 prob39 prob40 prob41 prob42 prob43 prob44 prob45 prob46
   <fct>  <fct>  <fct>  <fct>  <fct>  <fct>  <fct>  <fct>  <fct>  <fct>  <fct>  <fct>  <fct>  <fct> 
 1 NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA    
 2 NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA    
 3 NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA    
 4 NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA    
 5 NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA    
 6 NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA    
 7 NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA    
 8 NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA    
 9 NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA    
10 NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA

【问题讨论】:

  • 您可以编辑您的帖子添加dput(head(df)) 的输出吗?不确定如何解释分类变量的平均值?

标签: r dataframe lapply


【解决方案1】:

应该设置的数字是因子levels 和它们的标签

在下面的示例中,我假设分类数据值(“强烈同意”、“同意”等)是已知的,并且位于向量 levs 中。代码首先将字符串强制转换为因子,然后强制转换为数字。

df[2:4] <- lapply(df[2:4], factor, levels = levs, labels = c(1, 2, 3, 4, 5))
df[2:4] <- lapply(df[2:4], function(x) as.numeric(as.character(x)))

str(df)
#'data.frame':  10 obs. of  5 variables:
# $ X: num  -1.207 0.277 1.084 -2.346 0.429 ...
# $ A: num  4 4 5 4 3 4 5 2 5 2
# $ B: num  3 4 4 3 1 3 4 2 3 2
# $ C: num  5 1 3 1 5 1 1 2 1 3
# $ Y: num  0.09 0.5192 0.3843 0.0701 0.3206 ...

数据创建代码。

levs <- scan(what = character(),
          text = "
'Strongly disagree'
'Disagree'
'Neither agree nor disagree'
'Agree'
'Strongly agree'
")

set.seed(1234)

n <- 10
df <- data.frame(X = rnorm(n),
                 A = sample(levs, n, TRUE),
                 B = sample(levs, n, TRUE),
                 C = sample(levs, n, TRUE),
                 Y = runif(n),
                 stringsAsFactors = FALSE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    相关资源
    最近更新 更多