R如何按数据框中的列和行计算某些值的比例

R How to calculate a proportion of some value by column and by row in a data frame

示例数据框:

df <- data.frame(c('ab','cd','..'),c('ab','..','ab'),c('..','cd','cd'))

我正在尝试获取每一列和每一行的 ab 的比例,但忽略了分子和分母中总计中的 ..。

ab的比例=不包括..的ab总数/除了..的任何符号的数量

例如对于第 1 列(值为 ab、cd 和 ..),ab 的比例为 0.5

我目前拥有的:

fun <- function(x) {
    length(which(x == 'ab'))/length(which(x != '..'))
}
byColumn<- sapply(df[,1:ncol(df)],fun)
byRow <- sapply(df[1:nrow(df),],fun)

预期结果:

byColumn <- c(0.5,1.0,0.0)
byRow <- c(1.0,0.0,0.5)

实际结果:

byColumn <- c(0.5,1.0,0.0)
byRow <- c(0.5,1.0,0.0)

但是 byRow 不起作用...它似乎与 byColumn 的输出相同?

我会按如下方式定义函数(您可以随意设置)

Propfunc <- function(x, dim = "col", equal = "ab", ignore = ".."){
  if(dim == "col") return(unname(colSums(x == equal)/colSums(x != ignore)))
  if(dim == "row") return(rowSums(x == equal)/rowSums(x != ignore))
  else stop("Unknown dim")
}

Propfunc(df)
## [1] 0.5 1.0 0.0
Propfunc(df, dim = "row")
## [1] 1.0 0.0 0.5
Propfunc(df, dim = "blabla")
## Error in Propfunc(df, dim = "blabla") : Unknown dim

你可以保留你的功能。然后 byRow 你使用与 byColumn 相同的代码,但转置数据框:

byColumn <- sapply(df[, 1:ncol(df)], fun)
byRow <- sapply(as.data.frame(t(df))[, 1:ncol(df)], fun)

输出:

# By column
col1 col2 col3 
0.5  1.0  0.0 
# By row
 V1  V2  V3 
1.0 0.0 0.5