我有來自參與者串列的問卷 (EHP30) 答案,他們在 0 到 4 之間評分,或 -9 表示不相關。總分是縮放到 100 分的總和。如果有任何不相關的答案,它們將被忽略(除非它們都不相關,在這種情況下,輸出會丟失)。任何缺失的專案都會將整個輸出設定為缺失。
我撰寫了一個從輸入向量計算分數的函式:
ehp30_sexual <- function(scores = c(0, 0, 0, 0, 0)){
if(anyNA(scores)){
return(NA)
} else if(!all(scores %in% c(-9, 0, 1, 2, 3, 4))){
stop("Values not in correct range (-9, 0, 1, 2, 3, 4)")
} else if(length(scores) != 5){
stop("Must be vector length of 5")
} else if(all(scores == -9)){
return(NA)
} else if(any(scores == -9)){
newscores <- scores[which(scores != -9)]
sum(newscores) * 100 / (4 * length(newscores))
} else {
sum(scores) * 100 / (4 * length(scores))
}
}
如果可能,我希望使用 mutate 將此函式應用于資料幀的每一行(如果沒有,則應用):
ans <- c(NA, -9, 0, 1, 2, 3, 4)
set.seed(1)
data <- data.frame(id = 1:10,
ePainAfterSex = sample(ans, 10, TRUE),
eWorriedSex = sample(ans, 10, TRUE),
eAvoidSex = sample(ans, 10, TRUE),
eGuiltyNoSex = sample(ans, 10, TRUE),
eFrustratedNoSex = sample(ans, 10, TRUE))
有任何想法嗎?我很樂意重寫函式或使用case_when更簡單的解決方案。
uj5u.com熱心網友回復:
使用dplyr::rowwise()and c_across()(受@edvinsyk 的回答啟發):
set.seed(1)
library(dplyr)
data %>%
rowwise() %>%
mutate(score = ehp30_sexual(
c_across(ePainAfterSex:eFrustratedNoSex)
)) %>%
ungroup()
# A tibble: 10 × 7
id ePainAfterSex eWorriedSex eAvoidSex eGuiltyNoSex eFrustratedNoSex score
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 NA 0 NA -9 -9 NA
2 2 1 0 4 3 3 55
3 3 4 NA 2 NA 4 NA
4 4 NA 2 2 1 1 NA
5 5 -9 2 NA 4 1 NA
6 6 2 -9 NA NA 1 NA
7 7 4 3 3 1 -9 68.8
8 8 0 3 2 0 1 30
9 9 3 -9 2 3 NA NA
10 10 -9 4 -9 -9 4 100
uj5u.com熱心網友回復:
你追求的是這樣的東西嗎?似乎比您提供的功能更容易。
data = tibble(data)
data |>
mutate(across(where(is.numeric), ~ ifelse(.x == -9, NA, .x))) |>
rowwise() |>
mutate(index = sum(c_across(2:6), na.rm = TRUE)) |>
ungroup() |>
mutate(score = round(scales::rescale(index, to = c(0, 100))))
id ePainAfterSex eWorriedSex eAvoidSex eGuiltyNoSex eFrustratedNoSex index score
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 NA 0 NA NA NA 0 0
2 2 1 0 4 3 3 11 100
3 3 4 NA 2 NA 4 10 91
4 4 NA 2 2 1 1 6 55
5 5 NA 2 NA 4 1 7 64
6 6 2 NA NA NA 1 3 27
7 7 4 3 3 1 NA 11 100
8 8 0 3 2 0 1 6 55
9 9 3 NA 2 3 NA 8 73
10 10 NA 4 NA NA 4 8 73
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/531259.html
標籤:r
上一篇:使用dplyr和條件左連接
下一篇:獲取列中元素的頻率
