有時我會得到帶有李克特比例字串專案的調查資料,我需要將其更改為數字以計算基本的描述性統計資料。為了做到這一點,我通常使用 case_when 函式為每個專案創建一個新列,并為每個資料點分配一個數值。我正在嘗試撰寫一個可以同時為許多不同的列執行此操作的函式,這樣我就不必保留復制和粘貼代碼。我對此比較陌生,所以任何幫助將不勝感激:)
這是我之前在 R 中所做的:
#create data frame
df <- data.frame(v1 = c("Definitely True", "Somewhat True","Somewhat False","Definitely False"),
v2 = c("Definitely False","Somewhat False","Somewhat True","Definitely True"))
#Use case_when to add numeric columns to dataframe
df$v1n <- case_when((df$v1 == "Definitely True")==TRUE ~ "1",
(df$v1 == "Somewhat True")==TRUE ~ "2",
(df$v1 == "Somewhat False")==TRUE ~ "3",
(df$v1 == "Definitely False")==TRUE ~ "4")
df$v2n <- case_when((df$v2 == "Definitely True")==TRUE ~ "1",
(df$v2 == "Somewhat True")==TRUE ~ "2",
(df$v2 == "Somewhat False")==TRUE ~ "3",
(df$v2 == "Definitely False")==TRUE ~ "4")
如果我想用數值替換每個字串值并覆寫現有列中的資料,則此方法有效:
for(i in colnames(data_x)) {
data_x[[i]] <- case_when((data_x[,i] == "Definitely True")==TRUE ~ "1",
(data_x[,i] == "Somewhat True")==TRUE ~ "2",
(data_x[,i] == "Somewhat False")==TRUE ~ "3",
(data_x[,i] == "Definitely False")==TRUE ~ "4")
}
但是我想找到一種方法來為每次迭代創建一個新列,就像我對復制和粘貼版本所做的那樣。這是我嘗試過的方法,但沒有成功。對此的任何幫助將不勝感激。
for(i in colnames(df)) {
df[[var[i]]] <- case_when((df[,i] == "Definitely True")==TRUE ~ "1",
(df[,i] == "Somewhat True")==TRUE ~ "2",
(df[,i] == "Somewhat False")==TRUE ~ "3",
(df[,i] == "Definitely False")==TRUE ~ "4")
}
uj5u.com熱心網友回復:
dplyr
df %>%
mutate(across(v1:v2, ~ case_when(
. == "Definitely True" ~ "1",
. == "Somewhat True" ~ "2",
. == "Somewhat False" ~ "3",
TRUE ~ "4"
), .names = "{.col}n")
)
# v1 v2 v1n v2n
# 1 Definitely True Definitely False 1 4
# 2 Somewhat True Somewhat False 2 3
# 3 Somewhat False Somewhat True 3 2
# 4 Definitely False Definitely True 4 1
across使我們能夠跨多個列做一件事。我們可以使用v1:v2-syntax 或其他dplyr選擇器函式之一,如matches,starts_with等。- 這里的第二個引數
across是一個波浪號函式(rlang-style),.每次迭代都會用列資料替換它。例如,第一次評估這個波浪號函式時,.參考向量df$v1。 - 因為默認操作
mutate(across(...))將替換列,所以我添加.names=以控制結果資料的命名。此表示法使用glue-syntax,其中{.col}替換為在每次迭代中評估的列的名稱。
堿基R
我將添加查找圖的可選使用。
lookup <- c("Definitely True" = "1", "Somewhat True" = "2", "Somewhat False" = "3", "Definitely False" = "4")
df <- cbind(df, setNames(lapply(df[,1:2], function(z) lookup[z]), paste0(names(df[,1:2]), "n")))
rownames(df) <- NULL
df
# v1 v2 v1n v2n
# 1 Definitely True Definitely False 1 4
# 2 Somewhat True Somewhat False 2 3
# 3 Somewhat False Somewhat True 3 2
# 4 Definitely False Definitely True 4 1
uj5u.com熱心網友回復:
我傾向于以不同的方式做到這一點。如果您將 Likert Scale 列轉換為factor,并且級別以正確的順序排列,您可以使用as.integer(...)直接獲取數字級別,而無需所有這些case_when(...)業務。
這是一個使用示例data.table
library(data.table)
likertScale <- c("Definitely True", "Somewhat True","Somewhat False","Definitely False")
cols <- names(df)
setDT(df)[, c(cols):=lapply(.SD, factor, levels=likertScale)]
df[, paste0(cols, 'n'):=lapply(.SD, as.integer), .SDcols=cols]
df
## v1 v2 v1n v2n
## 1: Definitely True Definitely False 1 4
## 2: Somewhat True Somewhat False 2 3
## 3: Somewhat False Somewhat True 3 2
## 4: Definitely False Definitely True 4 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/481512.html
