2017-12-01 7 views
0

私は次のようdata.frameを持っている:ファクタを使用した計算の結果、リストによる回避 - 回避する方法は?

Lot Wafer Voltage Slope Voltage_irradiated Slope_irradiated m_dist_lot 
1 8 810 356.119 6.08423 356.427   6.13945   NA 
2 8 818 355.249 6.01046 354.124   6.20855   NA 
3 9 917 346.921 6.21474 346.847   6.33904   NA 
4 (...) 
120 9 914 353.335 6.15060 352.540   6.19277   NA 
121 7 721 358.647 6.10592 357.797   6.17244   NA 
122 (...) 

私の目標は、シンプルでありながらも少し難しいです。間違いなく、いくつかの方法でそれを解決することができます: ファクタに応じて各行に関数 "func"を適用したいとします。ファクター "ロット"。

data.frame$Lot: 7 

     354  355  363  367  378  419  426  427  428  431  460  477  836 
3.5231249 9.4229589 1.4996504 7.2984485 7.6883170 1.2354754 1.8547674 3.1129814 4.4303001 1.9634573 3.7281868 3.6182559 6.4718306 

data.frame$Lot: 8 
     1   2   11   15   17   18   19   20   21   22   24   25 
2.1415352 4.6459868 1.3485551 38.8218984 3.9988686 2.2473563 6.7186047 2.6433790 0.5869746 0.5832567 4.5321623 1.8567318 

最初の行は、データがから取得された初期data.frameの行と思われる。これは、この実際の動作が、結果によりリストである

m_dist_lot<- by(data.frame, data.frame$Lot,func) 

を介して行われ。 2番目の行は計算された値です。 私の問題は次のとおりです。これらの値を正しい行に基づいて元のdata.frameに正しく保存するにはどうすればよいですか?例えば

データフレームの特定の計算/列の場合:

data.frame$Lot: 8 
2 
4.6459868 
におけるdata.frameの第2行のため

m_dist_lot<- by(data.frame, data.frame$Lot,func) 

結果

Iの値を格納しますdata.frame $ m_dist_lot4.6459868正しい行 "" に従って:

Lot Wafer Voltage Slope Voltage_irradiated Slope_irradiated m_dist_lot 
1 8 810 356.119 6.08423 356.427   6.13945   NA 
2 8 818 355.249 6.01046 354.124   6.20855  4.6459868 
3 9 917 346.921 6.21474 346.847   6.33904   NA 
4 (...) 
120 9 914 353.335 6.15060 352.540   6.19277   NA 
121 7 721 358.647 6.10592 357.797   6.17244   NA 
122 (...) 

しかし、私はどのようにわかりません。私の最高の試みは実際には "unlist"を使うことです。

un[1] 
6.354 
3.523125 
un[2] 
6.355 
9.422959 
un[3] 
(..) 

しかしにおける

un<- unlist(m_dist_lot)結果は、私はまだ私が「factor.row」との「分離」の情報は、情報が正しく保存されるように値を「calculcated」できるのか分かりませんデータフレーム内にある。

un[1] 
3.523125 
un[2] 
9.422959 
un[3] 
1.49965 
(..) 

しかし、今、私はdata.frameに適切にこれらの値を割り当てる方法の情報が不足している:un<- unlist(m_dist_lot, use.names = FALSE)を使用した場合

は、少なくとも要因が存在していません。

ここ
(...) 
7.922 0.94130936 
7.976 4.89560441 
8.1  2.14153516 
8.2  4.64598677 
8.11  1.34855514 
(...) 

un<- do.call(rbind, lapply(m_dist_lot, data.frame, stringsAsFactors=FALSE))結果を使用して

私はまだ計算値<> data.frameの適切な割り当てを欠いています。 私は実践できる方法が必要であると確信しています。あなたは良い方法を知っていますか?

答えて

1

を、私はここで少し推測しています。しかし、私はdplyrがあなたの答えになると思います。

まず、私は一連の機能を通じて組み込みirisデータを渡すためにdplyrmagrittrからエクスポート)からパイプ(%>%)を使用するつもりです。 計算しようとしているものが完全なdata.frame(カラムだけでなく2つではない)を必要とする場合は、このアプローチを変更して必要な処理を行うことができます(data.frameを取る関数を書くだけで、興味のあるものを見つけたら、完全なdata.frameを返します)。

ここでは、最初にsplitiris種別データ(これはリストを作成し、種別ごとに別々のdata.frameを作成します)。次に、lapplyを使用して、リストの各要素に関数headを実行します。これで、それぞれが3行しか持たないdata.framesのリストが返されます。 (ここではheadをあなたの関心のある機能に置き換えることができます、それは完全なdata.frameを返します)。最後に、リストの各要素をbind_rowsと一緒につなぎます。

topIris <- 
    iris %>% 
    split(.$Species) %>% 
    lapply(head, n = 3) %>% 
    bind_rows() 

これが返されます:私は実際にあなたの根本的な問題に対処すると思うのアプローチを説明するために使用するつもりです

Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1   5.1   3.5   1.4   0.2  setosa 
2   4.9   3.0   1.4   0.2  setosa 
3   4.7   3.2   1.3   0.2  setosa 
4   7.0   3.2   4.7   1.4 versicolor 
5   6.4   3.2   4.5   1.5 versicolor 
6   6.9   3.1   4.9   1.5 versicolor 
7   6.3   3.3   6.0   2.5 virginica 
8   5.8   2.7   5.1   1.9 virginica 
9   7.1   3.0   5.9   2.1 virginica 

dplyrからの機能は、同様のアプローチを可能にするが、splitのdata.frameを必要としない。 data.frameがグループ化されると、それに適用されるすべての関数がグループごとに別々に適用されます。ここでは、各種内のセパールの長さをランク付けする実際の例を示します。これは明らかに直接有用ではありませんが、任意の数の列を引数として渡し(ベクトルとして渡す)、同じ長さのベクトルを返したカスタム関数を書くことができます(新しい列を作成するか、 1)。

 Species rank_Sepal_Length Sepal.Length 
     <fctr>    <dbl>  <dbl> 
1  setosa     3   5.1 
2  setosa     2   4.9 
3  setosa     1   4.7 
4 versicolor     3   7.0 
5 versicolor     1   6.4 
6 versicolor     2   6.9 
7 virginica     2   6.3 
8 virginica     1   5.8 
9 virginica     3   7.1 
:最後に select機能は、それが簡単に私が

topIris %>% 
    group_by(Species) %>% 
    mutate(rank_Sepal_Length = rank(Sepal.Length)) %>% 
    select(Species, rank_Sepal_Length, Sepal.Length) 

返しをしたかを確認できるようにすることしかありません

0

私はForce gsub to keep trailing zerosの助けを借りて、この問題を回避するだ:再生可能なデータやあなたがfuncが何をしたいのかの一例がないと

un<- do.call(rbind, lapply(list, data.frame, stringsAsFactors=FALSE)) 
un<- gsub(".*.","", un) 
un<- regmatches(un, gregexpr("(?<=.).*", un, perl=TRUE)) 

rows<- data.frame(matrix(ncol = 1, nrow = lengths(un))) 
colnames(rows)<- c("row_number") 
rows["row_number"]<- sprintf("%s", rownames(un)) 
rows["row_number"]<- as.numeric(un[,1]) 
rows["row_number"]<- sub("^[^.]*[.]", "", format(rows[,1], width = max(nchar(rows[,1])))) 
関連する問題