2016-05-26 4 views
0

データフレームを特定の行に制限し、列の一部の値を変更することはできますか? dplyrを使用して特定の行のデータフレームの値を変更する

のは、私が (SIZE_t+1 - SIZE_t)/SIZE_tとして GROWTHを計算し、今私は GROWTH(例えば1000)のためのいくつかの奇妙な値があることがわかります、その理由は、対応する SIZE変数の破損した値であるとしましょう。今私は SIZEの壊れた値を見つけて置き換えたいと思います。

私が入力した場合:

data <- mutate(filter(data, lead(GROWTH)==1000), SIZE = 2600) 

だけ破損した行はdataに格納され、私のデータフレームの残りの部分が失われます。その後、

私が代わりにやってみたいことはフィルタである左側の「データ」壊れた値の対応する行へと(右側)間違った変数を変異:

filter(data, lead(GROWTH)==1000) <- mutate(filter(data, lead(GROWTH)==1000), SIZE = 2600) 

しかし、それは動作していないようです。 dplyrを使ってこれを処理する方法はありますか?多くの感謝を事前に

+2

ようこそStackOverflow! [良い質問をする方法](http://stackoverflow.com/help/how-to-ask)と[再現可能な例を与える方法](http://stackoverflow.com/questions/)の情報をお読みください。 5963269/how-to-make-a-great-r-reproducible-example/5963610を参照)。これは他の人があなたを助けることをはるかに容易にします。 – Jaap

+0

このような置換は、通常、 '<- data %>%mutate(SIZE =置き換え(SIZE、GROWTH == 1000,2600))'で行われます。 –

+0

時々、このようなもののために 'dplyr'チェーンを破る価値があると思います - 'data $ SIZE [データ$ GROWTH == 1000] < - 2600'はそれをカバーします。 – thelatemail

答えて

1

mutate機能でifelseステートメントを使用することができます。たとえば、行3のSIZEに値4の大きな値を持つデータフレームがあり、行3のSIZEを値2の値0.3に置き換えたいとします(私はあなたと違うものを選んだ私の価値と一致するように)。それに応じてGROWTH > 1000の状態を置き換えることができます。

data 
      SIZE  GROWTH 
1 -1.49578498   NA 
2 -0.38731784 -0.7410605 
3 0.00010000 -1.0002582 
4 0.53842217 5383.2216758 
5 -0.65813674 -2.2223433 
6 0.29830698 -1.4532599 
7 0.04712019 -0.8420413 
8 -0.07312482 -2.5518788 
9 1.64310713 -23.4698959 
10 1.44927727 -0.1179654 

library(dplyr) 
data %>% mutate(SIZE = ifelse(lead(GROWTH > 1000, default = F), 0.3, SIZE)) 
      SIZE  GROWTH 
1 -1.49578498   NA 
2 -0.38731784 -0.7410605 
3 0.30000000 -1.0002582 
4 0.53842217 5383.2216758 
5 -0.65813674 -2.2223433 
6 0.29830698 -1.4532599 
7 0.04712019 -0.8420413 
8 -0.07312482 -2.5518788 
9 1.64310713 -23.4698959 
10 1.44927727 -0.1179654 

データ

structure(list(SIZE = c(-1.49578498093657, -0.387317841955887, 
1e-04, 0.538422167582116, -0.658136741561064, 0.298306980856383, 
0.0471201873908915, -0.0731248216938637, 1.64310713116132, 1.44927727104653 
), GROWTH = c(NA, -0.741060482026387, -1.00025818588551, 5383.22167582116, 
-2.22234332311492, -1.45325988053609, -0.842041284935343, -2.55187883883499, 
-23.4698958999199, -0.117965442690154)), class = "data.frame", .Names = c("SIZE", 
"GROWTH"), row.names = c(NA, -10L)) 
0

我々は速いだろうdata.tableを使用して所定の位置にこれを(:=)を割り当てることができます。 'data.frame'を 'data.table'(setDT(data))に変換し、 'i'に論理条件を指定し、 'i'条件を満たす 'SIZE'に(:=)0.3を割り当てます。

library(data.table) 
setDT(data)[shift(GROWTH, type="lead")>1000, SIZE := 0.3] 
data 
#   SIZE  GROWTH 
# 1: -1.49578498   NA 
# 2: -0.38731784 -0.7410605 
# 3: 0.30000000 -1.0002582 
# 4: 0.53842217 5383.2216758 
# 5: -0.65813674 -2.2223433 
# 6: 0.29830698 -1.4532599 
# 7: 0.04712019 -0.8420413 
# 8: -0.07312482 -2.5518788 
# 9: 1.64310713 -23.4698959 
#10: 1.44927727 -0.1179654 
関連する問題