2013-05-12 60 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)