在RStudio中为数据集中的每一行添加QN1到QN33的值,并计数0(缺失)值

kyvafyod  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(39)

我试图分析一个来自Stata背景的R数据集。
我有33个问题(标题为Q1到Q33),并试图通过这些问题,而不仅仅是使用一长行代码将它们添加到一起。我也知道缺失的数据,并已将其转换为0,但也想在计算平均得分时计算它们的流行率。
分数计算似乎有效,但缺失计算无效,它警告我,
在if(QN == 0){.:条件的长度> 1,并且只使用第一个元素
我的代码

library(readxl)
df <- read_excel("MICRO DATASET EDITING.xlsx")
#Convert All Columns to Integers, ignore errors those are NAs
df[] <- lapply(df, function(x) as.numeric(replace(x, is.na(x), 0)))
View(df)

###Calculate Total Scores###
Score <- 0
NumAnswered <- 33
Missing <- 0
for (x in 1:33) {
  QVal <- df[[paste("Q", x, sep = "")]]
  Score <- Score + QVal
  ifelse(QVal == 0, Missing <- Missing + 1)
}
df$Score <- Score
df$Missing <- Missing

我在网上看到这可能是由于if语句,所以我将其更改为

for (x in 1:33) {
  QVal <- df[[paste("Q", x, sep = "")]]
  Score <- Score + QVal
  ifelse(QVal == 0, Missing <- Missing + 1)
}
df$Score <- Score
df$Missing <- Missing

但这仍然是不正确的(它说所有的答案都不见了,即使分数已经被正确地计算出来)

yruzcnhs

yruzcnhs1#

R适用于矢量化操作和表格数据,这样可以避免循环。
R有两种主要的“方言”:base Rtidyverse(它们并不互相排斥!)。下面是一个例子,说明如何在这两个方面实现你所需要的,但还有其他方法。
注意:|>是管道操作符(我认为是在R 4.2中引入的)。它接受它左边的任何内容,并将其插入到它右边的表达式 * 作为它的第一个参数 *,因此mean(x, na.rm=TRUE)等效于x |> mean(na.rm=TRUE)

## simulate data
set.seed(1234)
df <- sample(100) |>
  matrix(ncol=10) |>
  as.data.frame()
# change column names
names(df) <- paste0("Q_", 1:10)
# introduce NAs
df[sample(10, 4), 2] <- NA
> df
   Q_1 Q_2 Q_3 Q_4 Q_5 Q_6 Q_7 Q_8 Q_9 Q_10
1   28  70  92  42  71  98  19  27  55   34
2   80  79  67  43  85  35  65  12  33   53
3   22  NA  96   2  57  72  23  89  24   74
4    9  14  66  54   8  94  63  64  13   11
5    5  56  47  49  26  73  20   1  39   69
6   38  NA  81  99  17  50   7  83  68   61
7   16  93  48  51  58  10  52  95  87   59
8    4  NA   3   6  91  45  37  75  18   82
9   86  NA  41  77  60  25  31  97  44  100
10  90  40  32  29  76  46  88  36  15   30

# get indices of columns that start with Q_
cols_to_select <- grep("Q_", names(df))
  • 底座R方式:
# create sum score
df$sum <- df[ , cols_to_select] |>
  rowSums(na.rm=TRUE) # na.rm=TRUE removes NAs before calculating row sums
# count NAs per row
df$na <- df[ , cols_to_select] |>
  is.na() |> # returns logical, TRUE if value is NA
  rowSums()
  • tidyverse方式:
# need to install tidyverse or at least dplyr
df <- df |> 
  dplyr::mutate( # mutate is used to create new columns
    # create sum scores
    sum = df |> dplyr::select(dplyr::starts_with("Q_")) |> rowSums(na.rm=TRUE),
    # count NAs per row
    na = df |> dplyr::select(dplyr::starts_with("Q_")) |> is.na() |> rowSums(na.rm=TRUE)
  )
> df
   Q_1 Q_2 Q_3 Q_4 Q_5 Q_6 Q_7 Q_8 Q_9 Q_10 sum na
1   28  70  92  42  71  98  19  27  55   34 536  0
2   80  79  67  43  85  35  65  12  33   53 552  0
3   22  NA  96   2  57  72  23  89  24   74 459  1
4    9  14  66  54   8  94  63  64  13   11 396  0
5    5  56  47  49  26  73  20   1  39   69 385  0
6   38  NA  81  99  17  50   7  83  68   61 504  1
7   16  93  48  51  58  10  52  95  87   59 569  0
8    4  NA   3   6  91  45  37  75  18   82 361  1
9   86  NA  41  77  60  25  31  97  44  100 561  1
10  90  40  32  29  76  46  88  36  15   30 482  0

要直接计算平均得分,可以使用rowMeans(na.rm=TRUE)

相关问题