gpt4 book ai didi

r - 在数据框中每行选择一个单元格

转载 作者:行者123 更新时间:2023-12-04 17:25:07 24 4
gpt4 key购买 nike

我有一个向量,它告诉我,对于日期框架中的每一行,应更新该行中的值的列索引。

> set.seed(12008); n <- 10000; d <- data.frame(c1=1:n, c2=2*(1:n), c3=3*(1:n))
> i <- sample.int(3, n, replace=TRUE)
> head(d); head(i)
c1 c2 c3
1 1 2 3
2 2 4 6
3 3 6 9
4 4 8 12
5 5 10 15
6 6 12 18
[1] 3 2 2 3 2 1

这意味着对于第 1 行和第 4 行,应该更新 c3;对于第 2、3 和 5 行,应该更新 c2(等等)。使用矢量化操作在 R 中实现这一点的最简洁方法是什么,即没有 apply和 friend ? 编辑:而且,如果可能的话,没有 R 循环?

我想过转型 d转换为矩阵,然后使用一维向量对矩阵元素进行寻址。但是后来我还没有找到一种干净的方法来从行和列索引计算一维地址。

最佳答案

使用您的示例数据,并仅使用前几行(下面的 DI),您可以轻松地通过矩阵轻松完成您的猜测。

set.seed(12008)
n <- 10000
d <- data.frame(c1=1:n, c2=2*(1:n), c3=3*(1:n))
i <- sample.int(3, n, replace=TRUE)
## just work with small subset
D <- head(d)
I <- head(i)

一、转换 D成矩阵:
dmat <- data.matrix(D)

接下来计算与 I 表示的行和列对应的矩阵的向量表示的索引。 .为此,使用 I 很容易生成行索引和列索引(由 seq_along(I) 给出)。在这个简单的例子中,它是向量 1:6 .要计算向量索引,我们可以使用:
(I - 1) * nrow(D) + seq_along(I)

其中第一部分( (I - 1) * nrow(D) )为我们提供了正确的行数倍数(此处为 6)来索引 I 的开头第 1 列。然后我们添加行索引以获得 I 中第 n 个元素的索引。第 1 列。

使用这个我们只需索引到 dmat使用 "[" ,将其视为向量。 "["的替换版( "[<-" ) 允许我们在一行中进行替换。在这里,我用 NA 替换了指示的元素为了更容易地看到识别出正确的元素:
> dmat
c1 c2 c3
1 1 2 3
2 2 4 6
3 3 6 9
4 4 8 12
5 5 10 15
6 6 12 18
> dmat[(I - 1) * nrow(D) + seq_along(I)] <- NA
> dmat
c1 c2 c3
1 1 2 NA
2 2 NA 6
3 3 NA 9
4 4 8 NA
5 5 NA 15
6 NA 12 18

关于r - 在数据框中每行选择一个单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10894402/

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