2017-08-30 10 views
1

RでExcelロジックを使用しようとしているのを前に私に許してもらえます。ある関数では、Xより前の行が単純なロジックを使用しているかどうかを調べようとしています。そうであれば、新しい列に「いいえ」でなければ「はい」と表示します。ここでr - lapply、ifelse、行と前の行を1つの列で比較しようとしています

はサンプルデータです:

temp <- data 
GetFUNC<- function(x){ 
     temp <- cbind(temp, NewCol = ifelse(temp[2:nrow(temp),8] > temp[1:(nrow(temp)-1),8], "yes","no")) 
     write.csv(temp, file = paste0(x,".csv")) 
} 
lapply(example,GetFUNC) 

あなたが列8を見ることができるだけので、それは次のようになります。

testdata$numbers 
[1] 32216510 10755328 8083097 6878500 8377025 6469979 10675856 8189887 5337239 
[10] 5156737 

エラー:任意の洞察力のための

Error in data.frame(..., check.names = FALSE) : 
    arguments imply differing number of rows: 11, 10 

感謝あなたは提供することができます!

+1

あなたのNewColには最初の要素がありません。 'NewCol = c(NA、ifelse [2:...]')を試すことができます。また、あなたは 'x'をどこで使っていますか? 'example'とは何ですか? –

+0

また、 '?diff'を見てください。これは値の間に' diff'を返します。例えば、 'c(NA、diff(nums)<0)'を実行することができます。 – thelatemail

答えて

3

は、いくつかの問題があります。

  • あなたはすでにベクトル化されている使用しているすべての操作以来lapplyを必要としません。
  • :はより緊密に-以上に結合(?Syntaxを参照)ので、1:(nrow(temp)-1(1:(nrow(temp))-1を意味します。あなたは1:(nrow(temp)-1)は、例えば、これらを比較したい:最後の一つは、あなたのifelse式を補正しても

    3:5-1 
    ## [1] 2 3 4 
    
    (3:5) - 1 # same 
    ## [1] 2 3 4 
    
    3:(5-1) # different 
    ## [1] 3 4 
    
  • は、テストデータの行数よりも1小さいベクトルを返します。最初にNAを追加してください。

1)さらに良いが、この入力データ・フレームを想定するtestdataであり、最後に注意のように定義される:

transform(testdata, NewCol = c(NA, ifelse(diff(numbers) < 0, "yes", "no"))) 

が付与:

numbers NewCol 
1 32216510 <NA> 
2 10755328 yes 
3 8083097 yes 
4 6878500 yes 
5 8377025  no 
6 6469979 yes 
7 10675856  no 
8 8189887 yes 
9 5337239 yes 
10 5156737 yes 

2)上記はおそらくあなたが望むものですが、ここでは動物園パッケージにrollapplyrを使用した2番目の解決方法があります。それは長さ2のローリングウインドウをとり、最初の値をNAで満たす各値に対してdiffを実行します。

library(zoo) 

transform(testdata, New = ifelse(rollapplyr(numbers, 2, diff, fill = NA) < 0, "yes", "no")) 

注:再現可能な形で入力testdataは次のとおりです。

testdata <- data.frame(numbers = c(32216510, 10755328, 8083097, 6878500, 
    8377025 , 6469979, 10675856, 8189887, 5337239, 5156737)) 
+0

私は最高のソリューション1が好きですが、それはラップトップでは機能しません。上記の関数で試してみると、すべての行に対して「いいえ」が返されます。しかし、あなたがそこにリストされているように私がそれを分離すれば、うまく動作します。助言がありますか? – frameworkgeek

+0

testdataのnumbers列の各要素に対してyesまたはnoを生成するのが問題の場合、答えの先頭に記載されているように、 'lapply'は必要ありません。問題が解決しない場合は、明確にしてください。 –

+0

私のせいで、私はCSVに保存するための階段を脱いだ。だから私はそれが嘆かわしい時にうまくいくと思っていた。 – frameworkgeek

0

はここで前の行を見てとmutateは、新しい列を追加するlagを使用してdplyrソリューションです。

library(dplyr) 
df1 <- data.frame(numbers = c(32216510, 10755328, 8083097, 6878500, 8377025, 
           6469979, 10675856, 8189887, 5337239, 5156737)) 

df1 %>% 
    mutate(NewCol = ifelse(lag(numbers) > numbers, "yes", "no")) 

    numbers NewCol 
1 32216510 <NA> 
2 10755328 yes 
3 8083097 yes 
4 6878500 yes 
5 8377025  no 
6 6469979 yes 
7 10675856  no 
8 8189887 yes 
9 5337239 yes 
10 5156737 yes 
関連する問題