Dataframe Column 是多个列值的偏移量 - 需要优雅的解决方案

Dataframe Column is an Offset of Multiple Column Values - Elegant solution desired

我正在寻找一个优雅的解决方案,它产生一列值,这些值是 'column offset' 列的列偏移量 = 'relative_column_position.' 提供了所需的答案(收音机)。

我的实际数据由数千行组成,其中约 300 个不同的列位置在 'relative_column_position,' 中表示,因此像这样的手动解决方案不在卡片中。

gaga <- tibble(relative_column_position = c(rep(1,3), rep(2,6), rep(3,3) ),
              col_1 = 1:12,
              col_2 = 13:24,
              col_3 = 25:36
        )
gaga

radio <- tibble( c(gaga$col_1[1:3], 
                   gaga$col_2[4:9],
                   gaga$col_3[10:12])
                 )

radio

这是分两步的基础 R 解决方案。

library(tibble)

gaga <- tibble(relative_column_position = c(rep(1,3), rep(2,6), rep(3,3) ),
               col_1 = 1:12,
               col_2 = 13:24,
               col_3 = 25:36
)

radio <- tibble(c(gaga$col_1[1:3], 
                   gaga$col_2[4:9],
                   gaga$col_3[10:12])
)

rcp <- split(seq_along(gaga$relative_column_position), gaga$relative_column_position)
unlist(mapply(\(x, i) x[i], gaga[-1], rcp))
#> col_11 col_12 col_13 col_21 col_22 col_23 col_24 col_25 col_26 col_31 col_32 
#>      1      2      3     16     17     18     19     20     21     34     35 
#> col_33 
#>     36

reprex package (v2.0.1)

创建于 2022-05-21

小标题:

rcp <- split(seq_along(gaga$relative_column_position), gaga$relative_column_position)
radio <- tibble(rcp = unlist(mapply(\(x, i) x[i], gaga[-1], rcp)))
rm(rcp)
radio
#> # A tibble: 12 × 1
#>      rcp
#>    <int>
#>  1     1
#>  2     2
#>  3     3
#>  4    16
#>  5    17
#>  6    18
#>  7    19
#>  8    20
#>  9    21
#> 10    34
#> 11    35
#> 12    36

reprex package (v2.0.1)

创建于 2022-05-21
df |> 
  mutate(rel = apply(df, 1, \(x) x[colnames(df)[x["relative_col"]]]  ))

to apply to your df example:

gaga |> 
  mutate(rel = apply(gaga, 1, \(x) x[colnames(gaga)[x["relative_column_position"] + 1]]  ))

假设您有一个相对列要映射,您可以使用 apply

mutate

使用矩阵子集的基础 R 答案 -

gaga <- data.frame(gaga)
result <- data.frame(value = gaga[cbind(seq_len(nrow(gaga)), 
                                        gaga$relative_column_position + 1)])

result

#   value
#1      1
#2      2
#3      3
#4     16
#5     17
#6     18
#7     19
#8     20
#9     21
#10    34
#11    35
#12    36

gaga$relative_column_position + 1 因为子集从数据集中的第 2 列开始。因此,当 gaga$relative_column_position 为 1 时,我们实际上想要从 gaga 数据集中的第 2 列中提取数据。