gpt4 book ai didi

R - Data.table - 在 RHS 操作中使用变量列名

转载 作者:行者123 更新时间:2023-12-05 08:43:10 24 4
gpt4 key购买 nike

如何在 := 操作的 RHS 上使用变量列名?例如,给定此 data.table“dt”,我想创建两个新列“first_y”和“first_z”,其中包含给定列的第一个观察值“x”。

dt <- data.table(x = c("one","one","two","two","three"), 
y = c("a", "b", "c", "d", "e"),
z = c(1, 2, 3, 4, 5))

dt
x y z
1: one a 1
2: one b 2
3: two c 3
4: two d 4
5: three e 5

如果没有可变列名,您将如何做到这一点。

dt[, c("first_y", "first_z") := .(first(y), first(z)), by = x]

dt
x y z first_y first_z
1: one a 1 a 1
2: one b 2 a 1
3: two c 3 c 3
4: two d 4 c 3
5: three e 5 e 5

但是,如果“y”和“z”列名称动态存储在变量中,我该怎么做呢?

cols <- c("y", "z")

# This doesn't work
dt[, (paste0("first_", cols)) := .(first(cols)), by = x]

# Nor does this
q <- quote(first(as.name(cols[1])))
p <- quote(first(as.name(cols[2])))
dt[, (paste0("first_", cols)) := .(eval(q), eval(p)), by = x]

我已经尝试了 quote() 和 eval() 以及 as.name() 的许多其他组合,但都没有成功。该操作的 LHS 似乎按预期工作并且在许多地方都有记录,但我找不到关于在 RHS 上使用可变列名的任何信息。提前致谢。

最佳答案

我不熟悉 first 函数(尽管它看起来像是 Hadley 会定义的东西)。

dt[, paste0("first_", cols) := lapply(.SD, head, n = 1L), 
by = x, .SDcols = cols]
# x y z first_y first_z
#1: one a 1 a 1
#2: one b 2 a 1
#3: two c 3 c 3
#4: two d 4 c 3
#5: three e 5 e 5

关于R - Data.table - 在 RHS 操作中使用变量列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34441599/

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