gpt4 book ai didi

r - R中的循环

转载 作者:行者123 更新时间:2023-12-02 06:40:35 24 4
gpt4 key购买 nike

这是我的问题:我有两个不同的数据帧(A和B)。每个数据框的列是地理位置,行数据是位置中的种类。我需要将数据框架A的位置1的种类列表与数据帧B的所有位置的种类列表相交。为此,我编写了一个循环,如下所示:

res<-list()
for(i in 1:length(B)) {intersect(A[1], B[i])->res[[i]]
}

现在,我必须对A的位置2、3、4、5、6 ...重复同样的循环,也就是说,我必须将A的所有位置与B的所有位置相交。

谢谢。

最佳答案

这是使用lapply()的类似的嵌套循环方法。

如果您的数据集很大,则使用lapply()可能会比使用循环获得相当可观的速度改进。 R中的循环很慢,建议尽可能在the *apply family中使用 vector 化函数。

我将通过一个示例,您也许可以将其适应您的数据集。

首先,我们制作了一个名为df的示例3x3数据帧,其中包含abc列,以及def行:

> df <- data.frame(a = sample(3), b = sample(3), c = sample(3))
> rownames(df) <- c('d','e','f')

让我们看一下 df及其转置 t(df):
> df
a b c
d 3 1 3
e 1 3 1
f 2 2 2

> t(df)
d e f
a 3 1 2
b 1 3 2
c 3 1 2

假设我们要 intersectdf的列 vector 。现在,我们使用嵌套的 t(df)语句在 lapply()和转置 intersect()的列 vector 上运行 df:
> result <- lapply(df, function(x) lapply(as.data.frame(t(df)), function(y) intersect(x,y)))

结果是 t(df),显示了相交结果:
> is.list(result)
[1] TRUE

> print(result)
$a
$a$d
[1] 3 1

$a$e
[1] 3 1

$a$f
[1] 2


$b
$b$d
[1] 1 3

$b$e
[1] 1 3

$b$f
[1] 2


$c
$c$d
[1] 3 1

$c$e
[1] 3 1

$c$f
[1] 2

让我们再次查看 list()df,看看如何读取这些结果:
> df
a b c
d 3 1 3
e 1 3 1
f 2 2 2

> t(df)
d e f
a 3 1 2
b 1 3 2
c 3 1 2

让我们看一下与 t(df)df$at(df)$d相交的 t(df)$e:
$a
$a$d
[1] 3 1

与 vector t(df)$fa相交: d
$a$e
[1] 3 1

同样,使用 vector {3,1,2}^{3,1,3} = {3,1}a: e
$a$f
[1] 2

最后,使用 vector {3,1,2}^{1,3,1} = {3,1}a: f {3,1,2}^{2,2,2} = {2}中的其他项目如下。

要将其扩展到数据集,请将数据框列视为局部,将转置数据框列视为物种。然后使用 result,如上所示。

要分解嵌套的 lapply()语句,请从内部 lapply()开始:
lapply(as.data.frame(t(df)), function(y) ... )

这意味着 lapply()中的每个列 vector ($ d,$ e和$ f列)都由 t(df)中的 y变量表示。一秒钟后,我们将回到 function(y)

现在让我们看一下外部的 ...:
lapply(df, function(x) ... )

这意味着 lapply()中的每个列 vector ($ a,$ b和$ c列)都由 df中的变量 x表示。

现在让我们解释 function(x)

外部 ......的任何功能-可以是 xlength()等,甚至是另一个 sum()。内部 lapply()具有自己的函数和变量名 lapply(),因此内部 y可以在 ...x上运行一个函数。

这就是我们要做的事情:对于 y中的每个列 vector ,我们分别对该 df -vector和转置 df中的每个列 vector 运行一个函数。在我们的示例中,我们将在 t(df)x上运行的函数是 y:
> result <- lapply(df, function(x) lapply(as.data.frame(t(df)), function(y) intersect(x,y)))

关于r - R中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8817533/

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