2013-05-12 63 views
1

在标准函数编程中,Mapl和函数F,并返回一个新列表,其中F应用于每个元素。例如,考虑:R数据帧上的高阶函数映射

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适用于的每个条目df

唯一困难的部分是搞清楚如何写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) 
} 

回答

2

R's recycli纳克规则工作的开箱

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)