【问题标题】:Creating a function (equation) based on different variable scores that loops through multiple columns根据循环多列的不同变量分数创建函数(方程)
【发布时间】:2021-06-10 14:12:04
【问题描述】:

我想同时根据多列中的不同变量分数运行这个方程:

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

如果我的 DF 看起来像这样

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

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

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

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

我相信我应该使用 for 循环,并从概念上理解它们,但不确定如何执行循环内的代码来做我想做的事情。

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

【问题讨论】:

  • 我没有得到公式。如何计算名为 20 且值为 c(1,1,NA,NA,0,2) 的列的 2/4?
  • 因为有 2 个“1”值,以及 4 个“哪些值”-(1,1,0,2)。因此,在我的等式中,2 个“1”值除以 4 个“计数值”对不起,我应该添加“1 分数的数量,2 分数的数量”等

标签: r for-loop multiple-columns equation


【解决方案1】:

如果 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))

【讨论】:

  • 不,我不需要手段,我需要准确性,这些值引用了这些值,但我没有明确提及。
  • 好的,抱歉。但我希望使用公式#scoring1/(#scoring1+#scoring2+#scoring0) 得到 1 的百分比(正确答案),其中 0 和 2 是不正确的答案。
  • 是的,我在读回来的时候才意识到!如果我只想在我的 DF 中运行第 50-100 列的代码,会不会是 colMeans(df [50:100] == 1, na.rm = TRUE)?
【解决方案2】:

您可以使用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...) 在分母中的计数过多。

要计算每列中的NAs,您可以简单地做

colSums(is.na(df))

【讨论】:

  • DF 中还有其他值,但在我要运行等式的列中没有,实际上是#scoring1/(#scoring1+#scoring2+#scoring0)。所以我想对 1-100 列中的值运行这个等式并查看输出。
【解决方案3】:

我们可以在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))

【讨论】:

  • 谢谢,我已将第一个答案用作解决方案,但我会根据您的建议扩展我的知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
相关资源
最近更新 更多