gpt4 book ai didi

r - 在ddply中映射

转载 作者:行者123 更新时间:2023-12-01 12:57:42 24 4
gpt4 key购买 nike

注意:这是对 previous question 的直接跟进


我有一个很长的数据框,由两列组成,我将它们用作函数的参数,该函数将使用 mapply 找到第三列的值:

df$3rd <- mapply(myfunction, A=df$1st, B=df$2nd)

其中 myfunction 有参数 A 和 B。虽然这对小型数据集很有效,但它对大型数据集停滞不前,所以我认为解决这个问题的一个好方法是使用 ddply。我不知道 ddply 是否是解决这个问题的最佳方法,但我在语法方面也遇到了一些麻烦。因此,我们将不胜感激。

这就是我正在尝试的:

> df$3rd <- ddply(df, .(1st), function(x) x$3rd <-
> mapply(myfunction, A=x$1st, B=df$second))

这是我得到的错误:

Error in `$<-.data.frame`(`*tmp*`, "n", value = c(1L, 1L, 1L, 1L, 1L,  : 
replacement has 112 rows, data has 16

编辑:



根据回答和评论,我在下面发布了一个可重现的小示例 - 这是上一个问题的答案之一。然而,正如下面的评论者所指出的,ddply 可能不是要走的路。我现在正在尝试 Ramnath 的解决方案。

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

最佳答案

ddply这不是你想要的,ddply(df,.(1st), FUNCTION)更像是:

for each val in unique(df$1st)
outdf[nrow(outdf)+1,] = FUNCTION( df[df$1st==val] )

也就是说,它使得outdfFUNCTION 组成适用于 df 的子集由列 1st 决定.

无论如何,我认为你的错误可能是因为你有 df而不是 xfunction(x) x$3rd<-mapply(myfunction,A=x$1st, B=df$second) (B 论点)?尽管没有工作示例很难说清楚。

到底是什么myfunction做?我认为你最好的选择是向量化 myfunction这样你就可以做 df$third <- myfunction( A=df$first, B=df$second ) .

例如,如果 myfunction <- function(A,B) { A+B } ,而不是做 mapply(myfunction,df$first,df$second)你可以等效地做 myfunction(df$first,df$second)甚至根本不需要 mapply。

关于r - 在ddply中映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8765593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com