基于循环多列的不同变量分数创建函数(方程)
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
中使用 summarise
和 across
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))
我想 运行 这个等式同时基于多个列中的不同变量分数:
#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
summarise
和 across
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))