示例数据框:
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的输出相同?
答案 0 :(得分:3)
我将按如下方式定义函数(您可以使用设置)
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
答案 1 :(得分:1)
您可以保留您的功能。然后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