gpt4 book ai didi

r - 根据data.table中一列的值改变多列的值

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

假设我有一个数据表,dt1:

dt1 <- data.table(
names = c("A1", "XX", "A2", "XY", "A3", "XZ"),
A1 = c( 0, 0, 0, 0, 0, 0),
A2 = c( 0, 0, 0, 0, 0, 0),
A3 = c( 0, 0, 0, 0, 0, 0)
)

我想要新的数据表:

dt2 <- data.table(
names = c("A1", "XX", "A2", "XY", "A3", "XZ"),
A1 = c( 1, 0, 0, 0, 0, 0),
A2 = c( 0, 0, 1, 0, 0, 0),
A3 = c( 0, 0, 0, 0, 1, 0)
)

即,如果 names 列的行值与特定列的名称相同,则该列的行值更改为 1

我可以通过以下代码实现:

dt1[names == "A1", "A1" := 1]
dt1[names == "A2", "A2" := 1]
dt1[names == "A3", "A3" := 1]

但我想知道是否有更简单的方法来执行此操作,尤其是当我要更改的列数很大时。

我尝试了以下几行,但它们没有用:

cln <- c("A1", "A2", "A3")
dt1[names == (cln), (cln) := 1]

最佳答案

使用 的高效 for(...) set(...) 组合:

for(j in names(dt1)[-1]) {
set(dt1, dt1[, .I[names == j]], j, value = 1)
}

给出:

> dt1
names A1 A2 A3
1: A1 1 0 0
2: XX 0 0 0
3: A2 0 1 0
4: XY 0 0 0
5: A3 0 0 1
6: XZ 0 0 0

除了 names(dt1)[-1],您还可以使用 setdiff(names(dt1), "names")

关于r - 根据data.table中一列的值改变多列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52490779/

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