2017-09-21 25 views
1

私はCSVテーブルをデータフレームとして持っています。特定の列の値を他の列の値で変更したい。他のカラムで列の値を変更してください。

私はコードを準備しましたが、動作しません。 データフレームには、1076行と156列が含まれています。

式は次のようになる必要があります:

if (a[i,"0Q-state"] == "done") && (a[i,0Q-01] == NA)) a[i,0Q-01] = 0; 
    else a[i,0Q-01] = a[i,0Q-01]; 

が、私はRでこれを行うことができますかわかりません。

>dataset4 
     0Q-state 0Q-01 0Q-02 0Q-03 0Q-04 0Q-05 0Q-06 0Q-07 0Q-08 0Q-09 
    1: done  1  1  1  1  1  1  1  1  NA 
    2:    1  1  1  1  1  1  NA 1  1 
    3: done  1  1  1  NA 1  1  1  1  1 
    5: done  1  1  1  1  0  0  0  1  0 
    6: done  1  1  1  1  0  0  0  1  0 
    7:    1  1  NA 1  0  0  0  1  0 
    8: done  1  1  1  1  0  0  0  1  0 


    sapply(c("0Q-01","0Q-02","0Q-03","0Q-04","0Q-05","0Q-06","0Q-07","0Q-08","0Q-09"), 
    function(y) { 
    dataset4[,y] <- sapply(c(1:1076), function(x) 
    ifelse (((is.na(dataset4[x,y])) && (dataset4[x,c("0Q-state")] == "done")) 
    ,0, dataset4[x,y]))} 
    ) 

出力することがあります。

 >dataset4 
     0Q-state 0Q-01 0Q-02 0Q-03 0Q-04 0Q-05 0Q-06 0Q-07 0Q-08 0Q-09 
    1: done  1  1  1  1  1  1  1  1  0 
    2:    1  1  1  1  1  1  NA 1  1 
    3: done  1  1  1  0  1  1  1  1  1 
    5: done  1  1  1  1  0  0  0  1  0 
    6: done  1  1  1  1  0  0  0  1  0 
    7:    1  1  NA 1  0  0  0  1  0 
    8: done  1  1  1  1  0  0  0  1  0 

答えて

1

私たちは試みることができる:

df[rep(df[, 1] == "done", ncol(df)) & is.na(df)] <- 0 
df 

1  done  1  1  1  1  1  1  1  1  0 
2     1  1  1  1  1  1  NA 1  1 
3  done  1  1  1  0  1  1  1  1  1 
4  done  1  1  1  1  0  0  0  1  0 
5  done  1  1  1  1  0  0  0  1  0 
6     1  1  NA 1  0  0  0  1  0 
7  done  1  1  1  1  0  0  0  1  0 

またはsapply()を使用して:

あなたはいつもで df[, 1]を置き換えることができ
myFunc <- function(x, y) ifelse(is.na(x) & y == "done", 1, x) 
data.frame(df[, 1], sapply(df[, -1], myFunc, y = df[, 1])) 

1 done 1 1 1 1 1 1 1 1 NA 
2  1 1 1 1 1 1 NA 1 1 
3 done 1 1 1 NA 1 1 1 1 1 
4 done 1 1 1 1 0 0 0 1 0 
5 done 1 1 1 1 0 0 0 1 0 
6  1 1 NA 1 0 0 0 1 0 
7 done 1 1 1 1 0 0 0 1 0 

df[, namesOfDummyVars]

+0

おかげ上記と同じように返します!素晴らしいサンプル。おそらく...あなたが知っているように、私はどのように自動的に列を反復処理できますか? –

+0

、 'sapply()' -approachが含まれています。 –

+0

btw。あなたのデータに 'dput()'を使い、次回に貼り付けてください。人々があなたの問題を再現しやすくします。 –

0

ととdf[, -1]質問はdata.tableでタグ付けされており、dataset4の印刷出力がdataset4が既にdata.tableオブジェクトであることを示唆しています。

「完了」とマークされた行のNAsを置き換えるために、data.tableの構文には3つのバリエーションがあります。

# create vector of names of columns to be changed 
cols <- sprintf("0Q-%02i", 1:9) 

# variant 1 
dataset4[`0Q-state` == "done", 
     (cols) := lapply(.SD, function(x) replace(x, is.na(x), 0L)), 
     .SDcols = cols][] 
0Q-state 0Q-01 0Q-02 0Q-03 0Q-04 0Q-05 0Q-06 0Q-07 0Q-08 0Q-09 
1:  done  1  1  1  1  1  1  1  1  0 
2:    1  1  1  1  1 NA  1  1 NA 
3:  done  1  1  1  0  1  1  1  1  1 
4:  done  1  1  1  1  0  0  0  1  0 
5:  done  1  1  1  1  0  0  0  1  0 
6:    1 NA  1  0  0  0  1  0 NA 
7:  done  1  1  1  1  0  0  0  1  0 

または

# variant 2 
lapply(cols, function(i) dataset4[`0Q-state` == "done" & is.na(get(i)), (i) := 0L]) 
dataset4 

または

# variant 3 --- data.table development version 1.10.5 
for (i in cols) 
    set(dataset4, which(dataset4[, "0Q-state"] == "done" & is.na(dataset4[, ..i])), i, 0L) 
dataset4 
関連する問題