gpt4 book ai didi

r - 通过行列索引替换数据框中的值时如何避免循环?

转载 作者:行者123 更新时间:2023-12-04 09:40:29 26 4
gpt4 key购买 nike

我希望能够通过按行和列索引来替换数据框中的值,给出行索引、列名和值的列表。

library(tidyverse)
cols <- sample(letters[1:10], 5)
vals <- sample.int(5)
rows <- sample.int(5)
df <- matrix(rep(0L, times = 50), ncol = 10) %>%
`colnames<-`(letters[1:10]) %>%
as_tibble

我可以通过对参数列表的 for 循环来做到这一点:

items <- list(cols, vals, rows) %>%
pmap(~ list(..3, ..1, ..2))

for (i in items){
df[i[[1]], i[[2]]] <- i[[3]]
}
df
#> # A tibble: 5 x 10
#> a b c d e f g h i j
#> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#> 1 0 0 0 0 0 0 0 1 0 0
#> 2 0 0 5 0 0 0 0 0 0 0
#> 3 0 0 0 0 0 0 4 0 0 0
#> 4 0 0 0 0 0 0 0 0 3 0
#> 5 0 0 0 0 0 0 0 0 0 2

但我觉得应该有一种更简单或更“更整洁”的方式来一次完成所有的任务,尤其是当项目超过 5 个时。假设我们知道我们不会覆盖相同的单元格或任何东西(索引组合不会重复),因此被修改的单元格不会根据您所处的周期而改变。您可以将这个问题称为“向量化分配”。

最佳答案

这可以在完全没有循环的情况下完成,无论是 for 还是 *apply 循环。
诀窍是使用索引矩阵。但由于这仅适用于 matrix 类的目标对象,因此将 tibbledata.frame 强制为 matrix 然后再强制返回。

我将使用@Ronak 的解决方案重复包含数据创建代码,以使代码自包含。

inx <- cbind(rows, match(cols, names(df1)))
df1 <- as.matrix(df1)
df1[inx] <- vals
df1 <- as.tibble(df1)

identical(df, df1)
#[1] TRUE

数据创建代码。
set.seed(1234)
cols <- sample(letters[1:10], 5)
vals <- sample.int(5)
rows <- sample.int(5)
df <- matrix(rep(0L, times = 50), ncol = 10) %>%
`colnames<-`(letters[1:10]) %>%
as_tibble

df1 <- df
mapply(function(x, y, z) df[x, y] <<- z, rows, cols, vals)

关于r - 通过行列索引替换数据框中的值时如何避免循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51961210/

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