根据 R 中的条件获取行总和
Obtain a row sum based on a condition in R
我正在为一项研究在工作中对 PES-brief 量表进行评分。
其中一个量表需要事件的频率:如果参与者得分为 1-3,则为 +1。如果为 0,则为 +0。我需要为每个人获得这个分数。
编辑:还有一些我不想添加的行。我不想求和 'dontadd'
这是我的数据框示例:
pesb0101 <- c(1,2,3,0,1,0,3,2,1,0)
pesb0102 <- c(1,1,0,0,3,2,3,2,1,0)
pesb0103 <- c(1,2,3,2,1,0,1,0,1,1)
df <- data.frame(pesb0101,pesb0102,pesb0103)
rownames(df) <- c('person1','person2','person3','person4','person5','person6','person7','person8','person9','person10')
df
pesb0101 pesb0102 pesb0103 dontadd
person1 1 1 1 1
person2 2 1 2 2
person3 3 0 3 3
person4 0 0 2 4
person5 1 3 1 5
person6 0 2 0 3
person7 3 3 1 9
person8 2 2 0 2
person9 1 1 1 1
person10 0 0 1 2
我需要一个总和的每个人的分数列,如果分数不为 0,则为 +1。所以我的数据框应该是:
> df
pesb0101 pesb0102 pesb0103 dontadd pesbScore
person1 1 1 1 1 3
person2 2 1 2 2 3
person3 3 0 3 3 2
person4 0 0 2 4 1
person5 1 3 1 5 3
person6 0 2 0 3 1
person7 3 3 1 9 3
person8 2 2 0 2 2
person9 1 1 1 1 3
person10 0 0 1 2 1
我尝试了几种不同的方法(主要是 rowSums),我想我可能遗漏了一些简单的东西。
apply()
可以 运行 一个数据帧的每一行的函数。如果你做一个简单的函数来按照你想要的方式评分,apply 可以完成剩下的工作:
score_counter <- function(row) {
sum(row != 0)
}
# first make a new data frame with just the columns you want to add
df_pesb = df[, grepl("pesb", names(df))]
# use the new data frame to count a score for each row
df$pesbScore = apply(df_pesb, 1, score_counter)
我正在为一项研究在工作中对 PES-brief 量表进行评分。 其中一个量表需要事件的频率:如果参与者得分为 1-3,则为 +1。如果为 0,则为 +0。我需要为每个人获得这个分数。
编辑:还有一些我不想添加的行。我不想求和 'dontadd'
这是我的数据框示例:
pesb0101 <- c(1,2,3,0,1,0,3,2,1,0)
pesb0102 <- c(1,1,0,0,3,2,3,2,1,0)
pesb0103 <- c(1,2,3,2,1,0,1,0,1,1)
df <- data.frame(pesb0101,pesb0102,pesb0103)
rownames(df) <- c('person1','person2','person3','person4','person5','person6','person7','person8','person9','person10')
df
pesb0101 pesb0102 pesb0103 dontadd
person1 1 1 1 1
person2 2 1 2 2
person3 3 0 3 3
person4 0 0 2 4
person5 1 3 1 5
person6 0 2 0 3
person7 3 3 1 9
person8 2 2 0 2
person9 1 1 1 1
person10 0 0 1 2
我需要一个总和的每个人的分数列,如果分数不为 0,则为 +1。所以我的数据框应该是:
> df
pesb0101 pesb0102 pesb0103 dontadd pesbScore
person1 1 1 1 1 3
person2 2 1 2 2 3
person3 3 0 3 3 2
person4 0 0 2 4 1
person5 1 3 1 5 3
person6 0 2 0 3 1
person7 3 3 1 9 3
person8 2 2 0 2 2
person9 1 1 1 1 3
person10 0 0 1 2 1
我尝试了几种不同的方法(主要是 rowSums),我想我可能遗漏了一些简单的东西。
apply()
可以 运行 一个数据帧的每一行的函数。如果你做一个简单的函数来按照你想要的方式评分,apply 可以完成剩下的工作:
score_counter <- function(row) {
sum(row != 0)
}
# first make a new data frame with just the columns you want to add
df_pesb = df[, grepl("pesb", names(df))]
# use the new data frame to count a score for each row
df$pesbScore = apply(df_pesb, 1, score_counter)