[英]Change values of multiple columns based on the value of one column in data.table
假設我有一個數據表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(i in colnames(dt1)[-1]) {
dt1[,i] <- ifelse(dt1[,"names"] == i, 1, 0)
}
使用data.table的高效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
您還可以使用setdiff(names(dt1), "names")
代替names(dt1)[-1]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.