1

在标准函数式编程中,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]

我想Map在 R 数据帧上使用这个概念。我希望我的函数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适用xdf.

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

F <- function(x) x / rowSum( row in which x belongs to in dataframe)
Map(F, df)
  1. 我该怎么写F

编辑这是一个迭代解决方案:

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

1 回答 1

2

R 的回收规则开箱即用

df / rowSums(df)

Adata.frame是等长向量(df[[2]]例如 try 或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)
于 2013-05-12T05:30:26.953 回答