gpt4 book ai didi

R data.table 列通配符与 sprintf

转载 作者:行者123 更新时间:2023-12-02 07:22:34 24 4
gpt4 key购买 nike

给定一个包含任意列数的 data.table

dt = data.table( a = letters[1:5], b = rep('-', 5), c = LETTERS[1:5] )
# a b c
# 1: a - A
# 2: b - B
# 3: c - C
# 4: d - D
# 5: e - E

和一个任意的format字符串,它有一些对应于列数的占位符

format = '%s0%s1%s'

如何应用 sprintf 而不用所有列名显式调用它?仅提供 data.table 是行不通的,因为在这种情况下 sprintf 需要 3 个参数。调用 sprintf(format, dt$a, dt$b, dt$b) 是不可能的,因为我既不知道 format 也不知道 data。表 预先。此外,sapply 对行索引不起作用,因为该操作必须在保留其顺序的行子集上完成。

idx = seq( 1, by = 2, to = 5 )

所以目标是通过发出假设命令

dt[ idx, sprintf( format, * )]

实现这个

# [1] "a0-1A" "c0-1C" "e0-1E"

调用即可

cols = paste( names( dt ) ), collapse=',' )
# "a,b,c"
eval( parse( text = sprintf( 'dt[ idx, sprintf( format,%s )]', cols ) ) )
# [1] "a0-1A" "c0-1C" "e0-1E"

但这是相当神秘的,而且绝对不是干净的代码,如果 data.table 包本身有更多的语义方式就好了。所以问题基本上是是否有一个。直到现在,google 和 data.table 手册都没有给我答案。此外,我既不想粘贴一些/多个列,而是想使用所有列,也不想寻找一种通过使用data.frame来实现这一点的方法.我正在寻找流畅的 data.table 语法。

最佳答案

我们可以通过将 sprintf 作为 do.call 中的参数传递来实现此目的

dt[, do.call(sprintf, c(.SD, fmt = format))]
#[1] "a-A" "b-B" "c-C" "d-D" "e-E"

如果我们需要将其创建为“dt”中的列,请分配 (:=) 它以创建新列

dt[, newCol := do.call(sprintf, c(.SD, fmt = format))]

我们还可以使用pastedo.call

dt[, newCol := do.call(paste0, .SD)]

关于R data.table 列通配符与 sprintf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41789712/

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