2017-03-03 16 views
0

生データとパーセントのカラムを持つデータセットがあります。いくつかのパーセンテージは100以上になってしまった。私はifelseステートメントを使って100より大きい数値を100に変換したい。しかし、ifelseステートメントを "PCT"という文字が入っているカラムに適用したい彼らの名前。ここでカラム名に基づいて複数のカラムに対してifelse文を使用

は一例です:

a <- c(4,6,1210,20, 603, 50) 
b <- c(50,60,10,400,311, 40) 
bubba <- data.frame(A_NUM=a, 
        A_PCT=b) 

私はあることを、最終的なフォーマットをたい:私が得ている

a <- c(4,6,1210,20, 603, 50) 
b <- c(50,60,10,100,100, 40) 

bubba_fixed <- data.frame(A_NUM=a, 
        A_PCT=b) 

最も近いがこれです:

bubba <- bubba [ , grepl("PCT" , names(bubba)) ] 
bubba <- as.data.frame(lapply(bubba, function(x) ifelse(x > 100, 100, x))) 

そして、それを元のデータセットに戻します。

ありがとうございました!

答えて

2

pminを使用できます。列名( 'j1')に 'PCT'を持つ列のインデックスを作成し、データセットをサブセット化し、列をループして(lapply(...)列のpminを100で取得し、データセット

のサブセットに割り当てます
j1 <- grep("PCT", names(bubba)) 
bubba[j1] <- lapply(bubba[j1], pmin, 100) 

pminは、引数としてベクトルをとります。 1つのベクトルの長さが1の場合は、それを長いベクトルの長さに再利用し、ベクトルを並列に最小にするベクトルを返します。ここで、pmin 1つの引数として列のそれぞれをとり、100

+1

月'pmin(x、y)'は 'ifelse(x> y、y、x)'をより効率的に計算する方法であり、すべての項を2回書く必要がなくなります。 – Frank

2

として第二これはlapplyを使用せずに、より直接的な方法である:

pct = grepl("PCT" , names(bubba)) 
bubba[, pct][ bubba[, pct] > 100 ] = 100 

例えば: は

に上記の2行を適用します
a <- c(4,6,1210,20, 603, 50) 
b <- c(50,60,10,400,311, 40) 
bubba <- data.frame(A_NUM=a, 
        A_PCT=b, B_num = a, B_PCT = b+10) 

> bubba 
    A_NUM A_PCT B_num B_PCT 
1  4 50  4 60 
2  6 60  6 70 
3 1210 10 1210 20 
4 20 400 20 410 
5 603 311 603 321 
6 50 40 50 50 

結果:

> bubba 
    A_NUM A_PCT B_num B_PCT 
1  4 50  4 60 
2  6 60  6 70 
3 1210 10 1210 20 
4 20 100 20 100 
5 603 100 603 100 
6 50 40 50 50 
関連する問題