R ddply中的mapply
注:这是对这一点的直接跟进R ddply中的mapply,r,dataframe,plyr,R,Dataframe,Plyr,注:这是对这一点的直接跟进 我有一个非常长的数据帧,由两列组成,我将它们用作函数的参数,该函数将使用mapply查找第三列的值,如下所示: df$3rd <- mapply(myfunction, A=df$1st, B=df$2nd) 这就是我得到的错误: Error in `$<-.data.frame`(`*tmp*`, "n", value = c(1L, 1L, 1L, 1L, 1L, : replacement has 112 rows, data has 1
我有一个非常长的数据帧,由两列组成,我将它们用作函数的参数,该函数将使用mapply查找第三列的值,如下所示:
df$3rd <- mapply(myfunction, A=df$1st, B=df$2nd)
这就是我得到的错误:
Error in `$<-.data.frame`(`*tmp*`, "n", value = c(1L, 1L, 1L, 1L, 1L, :
replacement has 112 rows, data has 16
“$
ddply
中的错误不是您在这里想要的,ddply(df,.(1st),FUNCTION)
更像是:
for each val in unique(df$1st)
outdf[nrow(outdf)+1,] = FUNCTION( df[df$1st==val] )
也就是说,它使由函数
组成的outdf
应用于df
列所确定的子集
在任何情况下,我认为您的错误可能是因为您在函数(x)x$3中使用了df
而不是x
。一般来说,plyr函数是为了方便起见(语法方便),apply函数族通常在考虑时间的时候做得更好。想提供一个可复制的小例子吗?@zach。看看我对你先前问题的解答。它不再需要使用mapply
和expand.grid
谢谢@mathematic.coffee。我认为你是对的——ddply不会带来性能提升,而且将我的函数矢量化是个好主意。然而,我的函数用于查找另外两个数据帧中的值——见上文和前面的问题——所以矢量化不可能实现。我想我会回到我的pre-R策略,它是用python处理我的数据,并使用R分析生成的表。@Zach。在的评论中,您找到了。“它对这个也有用吗?”马修道尔说。它可能适用于这种情况,但data.table不需要它。本问题旨在澄清前一个问题的解决方案之一遇到的问题。Ramnath的data.table解决方案速度足够快,内存占用更少,所以我可以直接使用他的解决方案,而不用担心这个问题。如果您想知道是否可以将多个参数传递给data.table,我不确定,但您肯定可以将其连续传递给函数。此外,-data.table的行为与data.frame不同,因此请仔细检查结果,直到确定正确为止。
library(reshape2)
foo <- data.frame(x = c('a', 'a', 'a', 'b', 'b', 'b'),
y = c('ab', 'ac', 'ad', 'ae', 'fx', 'fy'))
bar <- data.frame(x = c('c', 'c', 'c', 'd', 'd', 'd'),
y = c('ab', 'xy', 'xz', 'xy', 'fx', 'xz'))
nShared <- function(A, B) {
length(intersect(with(foo, y[x==A]), with(bar, y[x==B])))
}
# Enumerate all combinations of groups in foo and bar
(combos <- expand.grid(foo.x=unique(foo$x), bar.x=unique(bar$x)))
# Find number of elements in common among all pairs of groups
combos$n <- mapply(nShared, A=combos$foo.x, B=combos$bar.x)
# Reshape results into matrix form
dcast(combos, foo.x ~ bar.x)
# foo.x c d
# 1 a 1 0
# 2 b 0 1
for each val in unique(df$1st)
outdf[nrow(outdf)+1,] = FUNCTION( df[df$1st==val] )