尝试为数据框中的特定变量设置因子水平-Lapply返回NA

时间:2019-08-18 11:43:01

标签: r dataframe lapply

我有调查数据,我正在尝试将具有分类数据(“完全同意”,“同意”等)的多个变量转换为数字(“ 6”,“ 5” ..),以便以后进行分析(使用摘要/平均值)

我已经尝试过了:

list = [{}, {}]
for item in list:
    item['Age'] = 1
print(list)

但它返回NA的矩阵

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)))

1 个答案:

答案 0 :(得分:0)

应该设置的数字是因子水平及其标签

在下面的示例中,我假设类别数据值(“完全同意”,“同意”等)是已知的,并且位于向量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)