2017-10-06 41 views
0

警告メッセージが表示されます:「使用すると、長さが1より大きく、最初の要素のみが使用されます」次の関数fixED警告の意味:条件の長さが1以上で、最初の要素のみが使用されます

> fixED 
function(x) { 
    if(nchar(x) == 5) { 
     return(x) 
    } 
    else if(nchar(x) == 3) { 
     return(gsub('^(.{2})(.*)$', '\\100\\2', x)) 
    } 
    else if(nchar(x) == 4) { 
     return(gsub('^(.{2})(.*)$', '\\10\\2', x)) 
    } 
} 

ここでは、警告のフルセットです。

Warning messages: 
1: In if (nchar(x) == 5) { : 
    the condition has length > 1 and only the first element will be used 
2: In if (nchar(x) == 4) { : 
    the condition has length > 1 and only the first element will be used 
3: In if (nchar(x) == 3) { : 
    the condition has length > 1 and only the first element will be used 

私はこれに似ていますが、それらのどれものために明らかにしていないここにいくつかの他の質問があることを知っています私には何が問題なのでしょうか? Rのように、if文の中の論理式が> 1のベクトルを返すように聞こえます。私は、彼らが実際に1の論理ベクトルであることをかなり確信しているので、

しかし、私はそれが事実かもしれない方法を理解していない、次はそれを実証しているようだ:

> length((nchar("43") ==2)) 
[1] 1 

ができ、誰問題がここにあるのを見ますか?私は現時点で困っている。私はこの機能を適用したいと思いべきデータが次のようになります。

> df.short 
    AD ED 
9918 57 84 
9919 57 84 
9920 57 84 
9921 57 84 
9922 57 84 
9923 57 84 
9924 57 84 
9925 57 85 
9926 57 85 
9927 57 85 
9928 57 85 

私はそうのようにそれを適用します。

df.short$test <- fixED(paste(df.short$AD, df.short$ED, sep="")) 
+1

可能性のある重複したように、関数を適用するものを使用して、機能をループすることをお勧め.com/questions/22150423/if-returns-the-length-first-only-the-first-element-will-be-used)を返します。 – G5W

+0

おそらく重複していますが、問題はあなたが本当に1より長いベクトルを渡しているということです。自分自身を納得させるために、この 'length(paste(df.short $ AD、df.short $ ED、sep =" "))'を実行します。だからあなたの関数を変更せずにすばやく解決できるのは、* apply: 'sapply(paste(df.short $ AD、df.short $ ED、sep =" ")、fixED)'に入れることです。完全に再修正された修正は、あなたの条件を満たす 'x'の要素を置き換えるために' nchar'のベクトル出力を使うことです: 'x [nchar(x)== 3] < - gsub( '^( {2})(。*)$ '、' \\ 100 \\ 2 '、x [nchar(x)== 3]) ';最後に新しい関数の最後に 'x'を返します –

答えて

1

これ、

paste(df.short$AD, df.short$ED, sep="") 

は、ベクトルではありませんあなたの関数に渡すとき、スカラーに対するベクトルをテストしています:

nchar(x) == 5 
// stackoverflowの:

私は[リターン「の条件が長さ> 1を持っており、唯一の最初の要素が使用される」IF](HTTPSの

mapply(fixED, x = paste(df.short$AD, df.short$ED, sep="")) 
関連する問題