基于循环多列的不同变量分数创建函数(方程)

Creating a function (equation) based on different variable scores that loops through multiple columns

我想 运行 这个等式同时基于多个列中的不同变量分数:

#1分/(#1分+#2分+#0分)

如果我的DF是这样的

20   21   22     
1    NA   2
1    1    0
NA   2    0
NA   0    NA
0    NA   1
2    1    1

所以对于名为 20 的列(或位置 1,21 是位置 2 等),我将根据上述等式计算 2/4。

但我想同时为每一列计算这个(假设有 100 列),并且每一列都有不同数量的 1、2 和 0 分数和 NA(因此 NA 出现在不同的位置)位置和数量)。我不想在第一个等式中考虑 NA。

但是,我想再次运行 的第二个检查是同时检查所有列,以查看每列中有多少个 NA。

我认为我应该使用 for 循环,并从概念上理解它们,但不确定如何执行循环内的代码来执行我想要的操作。

如果有人能提供帮助,将不胜感激。

如果 0、1、2 和 NA 是您数据框中唯一可以执行的值 -

colMeans(df == 1, na.rm = TRUE)

# V1  V2  V3 
#0.5 0.5 0.4 

如果还有其他的值,可以专门找感兴趣的值。

colSums(df == 1, na.rm = TRUE)/colSums(df == 1 | df == 2 | df == 0, na.rm = TRUE)

对于这个数据集,这将给出与上面相同的输出。

数据

df <- structure(list(V1 = c(1L, 1L, NA, NA, 0L, 2L), V2 = c(NA, 1L, 
2L, 0L, NA, 1L), V3 = c(2L, 0L, 0L, NA, 1L, 1L)), 
class = "data.frame", row.names = c(NA, -6L))

您可以使用table来计算分数并执行以下操作:

calculateColumn <- function(columnValues) {
  scoreCounts <- table(columnValues)
  return(scoreCounts[["1"]]/sum(scoreCounts))
}
df <- data.frame(V1 = c(1,1,NA,NA,0,2), V2 = c(NA,1,2,0,NA,1),V3 = c(2,0,0,NA,1,1))

sapply(df,calculateColumn)

导致

V1  V2  V3 
0.5 0.5 0.4 

注意:我们假设数据帧中​​只有 0,1,2 和 NA,否则 sum(table...) 在分母中的计数会过多。

要计算每一列中的 NA 个,您可以简单地执行

colSums(is.na(df))

我们可以在 dplyr

中使用 summariseacross
library(dplyr)
df %>%
    summarise(across(everything(), ~ mean(. == 1, na.rm = TRUE)))
#   V1  V2  V3
#1 0.5 0.5 0.4

数据

df <- structure(list(V1 = c(1L, 1L, NA, NA, 0L, 2L), V2 = c(NA, 1L, 
2L, 0L, NA, 1L), V3 = c(2L, 0L, 0L, NA, 1L, 1L)), 
class = "data.frame", row.names = c(NA, 
-6L))