R数据帧上的高阶函数映射

时间:2013-05-12 05:15:45

标签: r dataframe higher-order-functions

在标准函数式编程中,Map采用列表l和函数F,并返回一个新列表,其中F应用于每个元素。举个例子来考虑:

F(x) = x^2 and the list l = [1, 2, 3, 4, 5]

Map(f, l)会生成列表:[1, 4, 9, 16, 25]

我想在R数据帧上使用Map这个概念。我希望我的函数F(x)能够计算x / rowSum(row that x belongs to in the dataframe).

考虑以下数据框:

df <- data.frame()
for(i in 1:5)
{
  df <- rbind(df, c(i, i+1, i+2, i+3, i+4))
}
colnames(df) <- c("a", "b", "c", "d", "e")

给出了:

  a b c d e
1 1 2 3 4 5
2 2 3 4 5 6
3 3 4 5 6 7
4 4 5 6 7 8
5 5 6 7 8 9

我希望Map(F, df)能够制作:

         [,1]      [,2] [,3]      [,4]      [,5]
v1 0.06666667 0.1333333  0.2 0.2666667 0.3333333
v2 0.10000000 0.1500000  0.2 0.2500000 0.3000000
v3 0.12000000 0.1600000  0.2 0.2400000 0.2800000
v4 0.13333333 0.1666667  0.2 0.2333333 0.2666667
v5 0.14285714 0.1714286  0.2 0.2285714 0.2571429

这是一个数据框,其中F应用于x中的每个条目df

唯一困难的部分是弄清楚如何写F:

F <- function(x) x / rowSum( row in which x belongs to in dataframe)
Map(F, df)
  1. 如何撰写F
  2. 编辑这是一个迭代解决方案:

    pStat <- data.frame()
     for(i in 1: 5)
     {
       v <- df[i,] / rowSums(df[i,])
       pStates <- rbind(pStates, v)
     }
    

1 个答案:

答案 0 :(得分:2)

R的回收规则开箱即用

df / rowSums(df)

data.frame是一个(面向列的)等长向量列表(例如,尝试df[[2]]str(df)),因此Map(F, df)充当通过将F应用于每列,在其他函数语言中。使用rowSums意味着数据都是数字的;然后使用矩阵通常是合适和有效的,其中回收仍然可以开箱即用。

m <- as.matrix(df)
m / rowSums(m)

可以使用闭包(例如,返回函数的函数)来向(低效)rowSums(df)解决方案提供常量参数(Map),该解决方案明确地作用于每一列

Ffactory <- function(df) { r = rowSums(df); function(x) x / r }
mapped <- Map(Ffactory(df), df)

记住将列表强制转换为数据框

as.data.frame(mapped)