通过仅对r中的选定列应用自定义函数来创建新列



我想将自定义函数应用于df的每一列,并将该函数返回的值分配给该数据框中的新列。我的函数从所选列中获取一个值向量(在我的例子中,将使用列12:17中的值),并返回一个计算值(多样性指数)。函数定义为:

shannon <- function(p){
if (0 %in% p) {
p = replace(p,p==0,0.0001)
} else {
p
}
H = -sum(p*log(p))
return (H)
}

数据集中的随机行看起来像这样:

p <- df[3000,12:17]
x1        x2        x3        x4         x5 x6
0.5777778 0.1777778 0.1555556 0.2888889 0.02222222  0

当我将自定义函数应用到这一行时,像这样:

shannon(as.vector(t(p)))

返回1.357692的正确计算值。

现在,我想通过将自定义函数应用于数据集的特定列,将该值变为数据集的新列。我尝试使用mutatesapply运行:

df <- mutate(df, shannon = sapply(as.vector(t(census[,12:17])), shannon))

但是它返回

Error in `mutate()`:
! Problem while computing `shannonVal = sapply(as.vector(t(census[, 12:17])), shannon)`.
✖ `shannonVal` must be size 9467 or 1, not 56802.

我的数据集中的行数是9467,所以应用程序返回的是6倍长的东西。但这是为什么,我该如何解决呢?

以Ric的评论为基础,df <- mutate(df, shannon = apply(census[,12:17], 1, function(x) {shannon(t(x)})可能会做到这一点

Ric的回答有效:df$shannon <- apply(df[,12:17], 1, shannon)

dfcensus是一样的,很抱歉混淆了

相关内容

  • 没有找到相关文章

最新更新