簡體   English   中英

根據data.table中一列的值改變多列的值

[英]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)
}

使用的高效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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM