2016-11-17 8 views
0

私はnの数のデータを持っています。最初の列は文字列で、その他は値です。それぞれ2つの列が一緒にされている(この例ではA1とA2は一緒にされ、B1、B2は一緒です):例として、1つのdfが私は何をしようとしていることであるデータフレーム内の文字列を設定するには

df <- structure(list(X = structure(c(1L, 6L, 8L, 9L, 4L, 7L, 2L, 3L, 
5L), .Label = c("Ajngs ", "HAUDD;HHEYDG", "hdgdhdgh", "hdgduk;ldodjg", 
"hdhzd;hftfgd", "Kuksjgd", "sjsggd;pfofjdg", "Tmlsks", "yhfkfu" 
), class = "factor"), A1 = c(6197300L, 54415000L, 18671000L, 
22473000L, 3922800L, 2137900L, 180210000L, 5053000L, 0L), A2 = c(3701100L, 
33892000L, 11169000L, 18095000L, 2734200L, 1423600L, 113860000L, 
3231300L, 0L), B1 = c(2496200L, 20523000L, 7502400L, 4378400L, 
0L, 714310L, 66351000L, 1821700L, 0L), B2 = c(1124900L, 18487000L, 
9858100L, 4413400L, 0L, 2137900L, 80461000L, 0L, 0L)), .Names = c("X", 
"A1", "A2", "B1", "B2"), class = "data.frame", row.names = c(NA, 
-9L)) 

の下

を見つけることができます

したがって、A2がA1の倍数であれば、A1がほぼ2倍であることを確認したいと考えています(は、もう1つの値より大きい1つの値をに設定します)。代わりに値。彼らは他の2倍ラガーされていない場合、

  A1  A2 
Ajngs 6197300 3701100 

例としてNAN

に設定し、出力が期待される。この

 A1  A2 
Ajngs Ajngs  NAN 

のようになりますので、A1はA2のほぼ倍であります出力

+1

入力データセットの完全な出力を表示してください – akrun

+3

値が「ほぼ倍」に設定されているしきい値はありますか?あなたは 'NaN'(数字ではない)または' NA'(欠損値)にもう一方を設定したいですか? – LAP

+0

文字列を意味するとは思わない...文字列は文字ですが、すべての列は整数です –

答えて

1

以下の修正コードを試してください。 almostDoubleの値を好みに変更してください。これは4列以上のデータフレームを受け入れます。

df <- structure(list(X = structure(c(1L, 6L, 8L, 9L, 4L, 7L, 2L, 3L, 
5L), .Label = c("Ajngs ", "HAUDD;HHEYDG", "hdgdhdgh", "hdgduk;ldodjg", 
"hdhzd;hftfgd", "Kuksjgd", "sjsggd;pfofjdg", "Tmlsks", "yhfkfu" 
), class = "factor"), A1 = c(6197300L, 54415000L, 18671000L, 
22473000L, 3922800L, 2137900L, 180210000L, 5053000L, 0L), A2 = c(3701100L, 
33892000L, 11169000L, 18095000L, 2734200L, 1423600L, 113860000L, 
3231300L, 0L), B1 = c(2496200L, 20523000L, 7502400L, 4378400L, 
0L, 714310L, 66351000L, 1821700L, 0L), B2 = c(1124900L, 18487000L, 
9858100L, 4413400L, 0L, 2137900L, 80461000L, 0L, 0L)), .Names = c("X", 
"A1", "A2", "B1", "B2"), class = "data.frame", row.names = c(NA, 
-9L)) 

new.df <- apply(df, MARGIN = 1, FUN = function(x){ 
    almostDouble <- 1.5 
    for(i in seq(from = 2, to = length(x), by = 2)){ 
     if(as.numeric(x[i]) > (almostDouble * as.numeric(x[i+1]))){ 
      x[i] <- x[1] 
      x[i+1] <- "NAN" 
     } 
     else if(as.numeric(x[i+1]) > (almostDouble * as.numeric(x[i]))){ 
      x[i+1] <- x[1] 
      x[i] <- "NAN" 
     } 
     else 
      x[i] <- x[i+1] <- "NAN" 
    } 
    return(x) 
}) 

new.df <- t(new.df) 
new.df <- as.data.frame(new.df) 
+0

ありがとう、私はコードを理解する!ありがとう、私は1つの疑いがある、それは整数値の4つ以上の列を持っているときに働いていますか? –

+0

修正されたコードは4つ以上の列では機能しません。 –

+0

訂正されたコードは4列以上で動作するようになりました。 –

関連する問題