在标准函数式编程中,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)
F
编辑这是一个迭代解决方案:
pStat <- data.frame()
for(i in 1: 5)
{
v <- df[i,] / rowSums(df[i,])
pStates <- rbind(pStates, v)
}
答案 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)