lapply,cbind,并在transform中应用

时间:2014-09-03 09:51:47

标签: r lapply

我正在lapply内使用transform

所以这可以按预期工作:

dfX1 = data.frame(a = rpois(100, 10), 
           b = rpois(100, 10))
dfX2 = transform(dfX1, c = a %in% c(6, 7))

但是,当我尝试这样的事情时:

dfX3 = transform(dfX1, 
                 c = apply(
                   do.call('cbind', 
                           lapply(c(a, b), 
                                  function(x) x %in% c(6, 7))), 1, sum))

我得到了奇怪的结果:

> head(dfX3)
   a  b  c
1  9  9 26
2  9  8 26
3  6  7 26
4  9 11 26
5 11  9 26
6 11 16 26

我的期望是lapply会返回一个由cbind强制转换为矩阵的向量列表,apply会将函数sum应用于行。

不确定我错过了什么。

1 个答案:

答案 0 :(得分:3)

在这种情况下,问题来自c(a, b),这是cols ab的串联。结果将是ab中等于6或7的值的数量,沿着这些行重复。

按列表(a,b)替换c(a,b)会得到正确的结果。

此外,更合成的方式或这样做是

transform(dfX1, c= apply( data.frame(a,b), 1, function(u) sum(u %in% 6:7)) )