2017-01-20 15 views
2

paste0関数を使用すると1つの問題が発生します。私は、データフレームを持っている: データ:エントリ自体の値が0でエントリが0の場合は、paste0エントリをスキップします。

C C13 H O N 
1 1 0 4 0 0 
2 2 0 4 0 0 
3 3 0 4 0 0 
4 4 0 4 0 0 
5 5 0 4 1 0 
6 1 1 4 1 0 
7 2 1 4 1 1 

data$formula = paste0("C", data$C, "C13", data$C13, "H", data$H, "O", data$O, "N",data$N) 

を使用して、私はこの問題は、私が0値を持つすべての文字列をしたいということです式列

C C13 H O N  formula 
1 1 0 4 0 0 C1C130H4O0N0 
2 2 0 4 0 0 C2C130H4O0N0 
3 3 0 4 0 0 C3C130H4O0N0 
4 4 0 4 0 0 C4C130H4O0N0 
5 5 0 4 1 0 C5C130H4O1N0 
6 1 1 4 1 0 C1C131H4O1N0 
7 2 1 4 1 1 C2C131H4O1N1 

を取得し、だから行1のために、C1C130H4O0N0の代わりにC1H4などのようにしたい。

私はので、私は

data$formula = paste0("C", data$C>0, "C13", data$C13>0, "H", data$H>0, "O", data$O>0, "N",data$N>0) 

を試みたが、これは私の唯一の真の偽の出力を与える...

誰もが、ここで私を助けてくださいか、これを解決する方法のアイデアを持ってもらえRには本当に新しいです?

ありがとうございます!

+0

値たら、[この記事を]有用見つけることができます(http://stackoverflow.com/questions/36304404/create-a-new-column-with-また、[最近のもの](http://stackoverflow.com/questions/41755021/r-function-categorize-by-column)を少し修正した後に –

答えて

2

ただ1回適用すれば十分です。

ロジック:最初に、apply(df, 1, ...)を使用して各行を繰り返しています。次に、whichを使用して、すべてのエントリが非ゼロであることを確認します。あなたは、インデックスを入手するには、それぞれのCOLNAMESのサブセットと

df$formula <- apply(df, 1, function(x){y = which(x!=0) 
             paste0(colnames(df)[y], x[y], collapse = "")}) 
# [1] "C1H4"   "C2H4"   "C3H4"   "C4H4"   "C5H4O1"  "C1C131H4O1" "C2C131H4O1N1" 

> df 
# C C13 H O N  formula 
#1 1 0 4 0 0   C1H4 
#2 2 0 4 0 0   C2H4 
#3 3 0 4 0 0   C3H4 
#4 4 0 4 0 0   C4H4 
#5 5 0 4 1 0  C5H4O1 
#6 1 1 4 1 0 C1C131H4O1 
#7 2 1 4 1 1 C2C131H4O1N1 
+0

ありがとう、両方のあなた! – JmO

1
> apply(apply(data, 1, function(x) ifelse(x>0, paste0(names(data), x), '')), 2, paste0, collapse='') 
      1    2    3    4    5    6    7 
     "C1H4"   "C2H4"   "C3H4"   "C4H4"  "C5H4O1" "C1C131H4O1" "C2C131H4O1N1" 

これは、データフレームの列に戻すことができます。一緒に

> apply(data, 1, function(x) ifelse(x>0, paste0(names(data), x), '')) 
    1 2 3 4 5 6  7  
C "C1" "C2" "C3" "C4" "C5" "C1" "C2" 
C13 "" "" "" "" "" "C131" "C131" 
H "H4" "H4" "H4" "H4" "H4" "H4" "H4" 
O "" "" "" "" "O1" "O1" "O1" 
N "" "" "" "" "" ""  "N1" 

外側applyペーストこの結果の列は、最終的な出力を得るために:

内側apply>0選択を行います。

+0

ありがとうございました! – JmO

関連する問題