2016-11-24 7 views
2

data.tableまたはdata.frameの値(つまり「x」)を列名で置換します。列エントリを列名で置き換えます。

例:

# sample data 
Substance <- LETTERS[1:10] 
Jan10 <- c("x","x",NA,NA,NA,"x","x","x","x",NA) 
Apr10 <- c("x",NA,"x",NA,"x","x","x","x",NA,"x") 
Jul10 <- c(NA,NA,NA,"x","x","x","x",NA,"x","x") 
Oct10 <- c("x","x","x","x",NA,"x",NA,"x",NA,"x") 

dt <- as.data.table(cbind(Substance, Jan10, Apr10, Jul10, Oct10)) 

# manually changing one column 
dt[Jan10=="x", Jan10 := "Jan10"] 

目的:すべての列が変更Jan10列のようになります。各列の「x」値を対応する列名で置き換えるにはどうすればよいですか?アドバイスありがとう。

+1

と値が要因でない、あなたが行うことができます' INDX < - これは(is.na(df)、arr.ind = TRUE)。 df [indx] < - names(df)[indx [、 "col"]] ' –

+0

実際、私には要因があります。できます。以下のように、このアイデアは、NAではなく「x」を置き換えることでした。 – andrasz

+0

'is.na(df)'を 'df ==" x "'に変更してください。将来的に値を変更する予定がある場合は、要素を使用しない方が良いでしょう(または 'cbind')。私はあなたのデータを次のように 'df

答えて

1

私たちは列をループ、NAを置き換えるためにsetを使用しますが、 `data.frame`と列を持っている場合は、列名

for(j in 2:ncol(dt)){ 
    set(dt, i=which(dt[[j]]=="x"), j=j, value = names(dt)[j]) 
} 

dt 
# Substance Jan10 Apr10 Jul10 Oct10 
# 1:   A Jan10 Apr10 NA Oct10 
# 2:   B Jan10 NA NA Oct10 
# 3:   C NA Apr10 NA Oct10 
# 4:   D NA NA Jul10 Oct10 
# 5:   E NA Apr10 Jul10 NA 
# 6:   F Jan10 Apr10 Jul10 Oct10 
# 7:   G Jan10 Apr10 Jul10 NA 
# 8:   H Jan10 Apr10 NA Oct10 
# 9:   I Jan10 NA Jul10 NA 
#10:   J NA Apr10 Jul10 Oct10 
+1

あなたの迅速な対応に感謝します。できます。しかし、その考え方は、NAではなく「x」のエントリを変更することでした。それに応じて変更しました! – andrasz

関連する問題