R data.table - 在新列中设置值,其中其他列中的值 = 1
R data.table - Set Value in new column where value in other columns = 1
您可能会从 Kaggle 中认出这一点。我有多个名为 Soil_Type1 的列一直到 Soil_Type40。如果不存在该土壤类型,则值为 0,如果存在,则值为 1。每行只能存在一种土壤类型。
我想创建一个新列,如果 Soil_Type1 = 1 则取值 S1,如果 Soil_Type2 = 1 等则取值 S2。我可以用蛮力做到这一点,即一次每一行。有什么循环的方法吗?
train_raw[,16:53 := lapply(.SD, as.character), .SDcols =16:53 ]
train_raw[,Soil_Type := "" ]
train_raw[Soil_Type1 == 1, Soil_Type := "S1"]
train_raw[Soil_Type2 == 1, Soil_Type := "S2"]
train_raw[Soil_Type3 == 1, Soil_Type := "S3"]
train_raw[Soil_Type4 == 1, Soil_Type := "S4"]
编辑:
抱歉,这就是您所说的可重现示例的意思吗?
train_raw <- data.table(Soil_Type = "",
Soil_Type1 = c(0,0,0,1),
Soil_Type2 = c(0,0,1,0),
Soil_Type3 = c(1,1,0,0))
train_raw[,Soil_Type := "" ]
感谢David Arenburg的回答。
train_raw[, Soil_Type := "" ]
indx <- which(names(train_raw) == "Soil_Type")
cols <- paste0("Soil_Type", 1:4)
for(j in 1:length(cols))
set(train_raw,which(train_raw[[cols[j]]] == 1L),
j = indx, value = paste0("S", j))
您可能会从 Kaggle 中认出这一点。我有多个名为 Soil_Type1 的列一直到 Soil_Type40。如果不存在该土壤类型,则值为 0,如果存在,则值为 1。每行只能存在一种土壤类型。
我想创建一个新列,如果 Soil_Type1 = 1 则取值 S1,如果 Soil_Type2 = 1 等则取值 S2。我可以用蛮力做到这一点,即一次每一行。有什么循环的方法吗?
train_raw[,16:53 := lapply(.SD, as.character), .SDcols =16:53 ]
train_raw[,Soil_Type := "" ]
train_raw[Soil_Type1 == 1, Soil_Type := "S1"]
train_raw[Soil_Type2 == 1, Soil_Type := "S2"]
train_raw[Soil_Type3 == 1, Soil_Type := "S3"]
train_raw[Soil_Type4 == 1, Soil_Type := "S4"]
编辑:
抱歉,这就是您所说的可重现示例的意思吗?
train_raw <- data.table(Soil_Type = "",
Soil_Type1 = c(0,0,0,1),
Soil_Type2 = c(0,0,1,0),
Soil_Type3 = c(1,1,0,0))
train_raw[,Soil_Type := "" ]
感谢David Arenburg的回答。
train_raw[, Soil_Type := "" ]
indx <- which(names(train_raw) == "Soil_Type")
cols <- paste0("Soil_Type", 1:4)
for(j in 1:length(cols))
set(train_raw,which(train_raw[[cols[j]]] == 1L),
j = indx, value = paste0("S", j))