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

时间:2015-08-18 11:23:51

标签: r dataframe sapply

示例数据框:

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的输出相同?

2 个答案:

答案 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