【问题标题】:vectorise rows of a dataframe, apply vector function, return to original dataframe r向量化数据帧的行,应用向量函数,返回原始数据帧 r
【发布时间】:2016-11-29 02:19:13
【问题描述】:

给定以下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 之类的向量(并返回向量)到位置 bd 的列。

然后,我想将输出返回到 df 中,或者作为 df 新列中的向量,或者替换原始数据。

我想避免将它写成for 循环,它会迭代每一行,将单元格的内容拉出到一个向量中,做它的事情然后放回去。

有没有更有效的方法?我已经尝试了 apply 系列函数,但我一直在努力寻找一种好的方法来逐行矢量化列的内容并获得正确的输出。

最终输出可能看起来像这样(假设我应用了 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)

其中输出是一个向量。

【问题讨论】:

  • 请在您的问题中发布您想要的输出。 4:2 的意思尚不清楚。这是否意味着从 d 列到 b 列的 cummax(按行)?
  • 实际上这意味着这些列的 cummax 逐行。我已按要求编辑了我的帖子。

标签: r vector


【解决方案1】:

似乎这只是一个简单的apply 问题,您想 cbind 到 df:

> 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

【讨论】:

  • OP 不想要列的相反顺序,只想要原始顺序。他的帖子已更新以显示这一点。
  • 太完美了!我也遇到了面向列的矩阵问题。但我对apply 也很傻,现在写了function(x) cummax(x) 这样的东西,这是一个新手错误......
  • 实际上还有一个问题,如果我破坏性地分配了我的输出,我会丢失a 列中的信息,对吗?我怎么能防止呢?我在想的有点像dplyr::mutate 所做的事情,例如,添加到它正在处理的 df 中。
  • @Imo 订单是一个小细节,但确实可能值得编辑,这样其他人看这个问题就不会迷路。但是,我很想知道如何将输出保留在原始 df 中,同时保留列 a。而不是像这里显示的那样绑定两个 dfs。对我来说这不是世界末日,但我很好奇:)
  • 我不明白。我确实保留了“a”列。它将与df &lt;- cbind(df, t(apply(df[ , 4:2] , 1, cummax) ) ) 一起保存,我实际上并没有绑定2 个dfrms,因为apply(或t(apply,)) 的结果将是一个矩阵。如果你想要一个文本结果,请使用paste
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2021-09-01
相关资源
最近更新 更多