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
示例数据框:
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