簡體   English   中英

嘗試為數據框中的特定變量設置因子水平--Lapply 返回 NA

[英]Trying to set factor levels for specific variables in data frame--Lapply returns NA

我有調查數據,我正在嘗試將具有分類數據(“非常同意”、“同意”等)的多個變量轉換為數字(“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)))

但它返回一個 NA 矩陣

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

應該設置的數字是因子水平及其標簽

在下面的示例中,我假設分類數據值(“強烈同意”、“同意”等)是已知的並且位於向量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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM