鉴于以下df:
a=c('a','b','c')
b=c(1,2,5)
c=c(2,3,4)
d=c(2,1,6)
df=data.frame(a,b,c,d)
a b c d
1 a 1 2 2
2 b 2 3 1
3 c 5 4 6
我希望将通常采用向量(并返回向量)的函数(例如cummax
)逐行应用到位置b
到d
的列中。
然后,我希望将输出返回到df中,或者作为df的新列中的向量,或者替换原始数据。
我希望避免把它写成for
循环,它会迭代每一行,将单元格的内容拉出到一个向量中,做它的东西并把它放回去。
有更有效的方法吗?我已经给出了应用族函数,但是我很难先得到一个很好的方法来逐行矢量化内容并得到正确的输出。
最终输出可能看起来像那样(想象我已经应用了cummax()函数)。
a b c d
1 a 1 2 2
2 b 2 3 3
3 c 5 5 6
或
a b c d output
1 a 1 2 2 (1,2,2)
2 b 2 3 1 (2,3,3)
3 c 5 4 6 (5,5,6)
其中output是矢量。
答案 0 :(得分:1)
似乎这只是一个简单的apply
问题,你想要解决这个问题:
> cbind(df, apply(df[ , 4:2] # work with columns in reverse order
, 1, # do it row-by-row
cummax) )
a b c d 1 2 3
d a 1 2 2 2 1 6
c b 2 3 1 2 3 6
b c 5 4 6 2 3 6
哎哟。由于没有注意到这将在面向列的矩阵中返回并且需要转置该结果而被咬住;这样的新手错误。但它确实显示了我想有一个可重现数据集的问题的价值。
> cbind(df, t(apply(df[ , 4:2] , 1, cummax) ) )
a b c d d c b
1 a 1 2 2 2 2 2
2 b 2 3 1 1 3 3
3 c 5 4 6 6 6 6
要破坏性地将结果分配给df,您只需使用:
df <- # .... that code.
这与逗号串联(因此不再需要转置:
> cbind(df, output=apply(df[ , 4:2] , 1, function(x) paste( cummax(x), collapse=",") ) )
a b c d output
1 a 1 2 2 2,2,2
2 b 2 3 1 1,3,3
3 c 5 4 6 6,6,6