-2

これは Kaggle からわかるかもしれません。Soil_Type1 から Soil_Type40 までの複数の列があります。その土壌タイプが存在しない場合は値 0、存在する場合は 1 になります。列ごとに存在できる土壌タイプは 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 := "" ]
4

1 に答える 1

1

答えてくれた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))
于 2015-10-15T13:14:33.850 に答える