r - 从数据帧的第 n 列中获取值,每行 n 不同

标签 r dataframe vectorization

如何从某个数据帧的第 n 列构造值向量,其中 n 是某个向量中定义的每行值?示例:

> df <- data.frame(a=c(100, 110, 120, 130, 140),
                   b=c(200, 210, 220, 230, 240),
                   c=c(300, 310, 320, 330, 340))
> df
    a   b   c
1 100 200 300
2 110 210 310
3 120 220 320
4 130 230 330
5 140 240 340
> cl <- c(1, 3, 3, 2, 1)
> some.function(df, cl)

会导致:

[1] 100 310 320 230 140

最佳答案

您可以按 2 列矩阵进行索引 - 第一列是行号,第二列是列号。

df[cbind(seq(cl), cl)]
# [1] 100 310 320 230 140

这是一个矢量化操作,应该比使用 sapply 等循环遍历行并从该行获取适当的值更快:

# Slightly larger example, with 1000 rows
set.seed(144)
df <- matrix(rnorm(3000), nrow=1000)
cl <- sample(3, 1000, replace=TRUE)
all.equal(df[cbind(seq(cl), cl)], sapply(seq(nrow(df)), function(i) df[i, cl[i]]))
# [1] TRUE
library(microbenchmark)
microbenchmark(df[cbind(seq(cl), cl)], sapply(seq(nrow(df)), function(i) df[i, cl[i]]))
# Unit: microseconds
#                                             expr     min      lq       mean   median
#                           df[cbind(seq(cl), cl)]  23.828  26.335   34.26012  30.0350
#  sapply(seq(nrow(df)), function(i) df[i, cl[i]]) 855.481 922.449 1178.47502 996.3815
#         uq      max neval
#    38.0315  135.894   100
#  1111.3960 3414.374   100

关于r - 从数据帧的第 n 列中获取值,每行 n 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30279874/

相关文章:

独立性的Matlab测试

r - 将 sparklyr 连接到远程 spark 连接

javascript - 有多个地 block 时悬停消息的位置出错

python - 如何将 pandas 系列应用于 Dataframe?

Python:lambda 表达式的数据帧错误

python - 在 Python 中将小时和分钟转换为总分钟

assembly - 使用 ARM NEON 汇编对 atan2 进行 SIMD 向量化

r - dplyr:如何计算每组内不同值的频率

python - 如何获得ndarray的元素平均值

c++ - 使用 SIMD/SSE 的水平运行差异和条件更新?